├── CreateAndSaveGraySeq.m ├── GrayCodePattern.m ├── GrayCodePattern4ProjectorCalibration.m ├── LICENSE ├── README.md ├── grays.m └── output ├── 1.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── 18.jpg ├── 19.jpg ├── 2.jpg ├── 20.jpg ├── 21.jpg ├── 22.jpg ├── 23.jpg ├── 24.jpg ├── 25.jpg ├── 26.jpg ├── 27.jpg ├── 28.jpg ├── 29.jpg ├── 3.jpg ├── 30.jpg ├── 31.jpg ├── 32.jpg ├── 33.jpg ├── 34.jpg ├── 35.jpg ├── 36.jpg ├── 37.jpg ├── 38.jpg ├── 39.jpg ├── 4.jpg ├── 40.jpg ├── 41.jpg ├── 42.jpg ├── 5.jpg ├── 6.jpg ├── 7.jpg ├── 8.jpg └── 9.jpg /CreateAndSaveGraySeq.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/CreateAndSaveGraySeq.m -------------------------------------------------------------------------------- /GrayCodePattern.m: -------------------------------------------------------------------------------- 1 | function [ grayPatternSeq ] = GrayCodePattern( resolution ) 2 | % input: resolution: the gray pattern img size you want 3 | 4 | col_proj_img_num = ceil(log2(resolution(1))); 5 | row_proj_img_num = ceil(log2(resolution(2))); 6 | 7 | % generate col pattern seq 8 | col_gray_de = grays(col_proj_img_num); 9 | mat = transpose(flip(transpose(de2bi(col_gray_de)))); 10 | 11 | colPatternSeq = zeros(resolution(2), resolution(1), col_proj_img_num); 12 | 13 | for i = 1:col_proj_img_num 14 | colPatternSeq(:, :, i) = transpose(repmat(mat(:, i), 1, resolution(2))); 15 | end 16 | 17 | % generate row pattern seq 18 | row_gray_de = grays(row_proj_img_num); 19 | mat2 = transpose(flip(transpose(de2bi(row_gray_de)))); 20 | 21 | rowPatternSeq = zeros(resolution(2), resolution(1), row_proj_img_num); 22 | 23 | for i = 1:row_proj_img_num 24 | rowPatternSeq(:, :, i) = repmat(mat2(1:resolution(2), i), 1, resolution(1)); 25 | end 26 | 27 | % cat 2 seq 28 | grayPatternSeq = cat(3, colPatternSeq, rowPatternSeq); 29 | 30 | end 31 | 32 | -------------------------------------------------------------------------------- /GrayCodePattern4ProjectorCalibration.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/GrayCodePattern4ProjectorCalibration.m -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Johnny Law 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GrayCodePatternSeq 2 | Generate gray code pattern sequence images, time-coded light patterns , used in structured light. 3 | 4 | This simple project is inspired by [*Gray code pattern sequence*](https://cn.mathworks.com/matlabcentral/answers/21857-gray-code-pattern-sequence) and use `grays` function in [*Gray Code Manipulation*](https://cn.mathworks.com/matlabcentral/fileexchange/15570-gray-code-manipulation). 5 | 6 | 7 | 8 | ## Usage 9 | 10 | 1. Create `./output/` directory. 11 | 2. Modify the input value `resolution` in `CreateAndSaveGraySeq.m`, which specifies the output pattern image's size. 12 | 3. Choose `GrayCodePattern4ProjectorCalibration(resolution)` or `GrayCodePattern(resolution)` function in `CreateAndSaveGraySeq.m`. 13 | 4. Run `CreateAndSaveGraySeq.m` in Matlab. 14 | 5. Get the gray code pattern sequence in `./output/` directory. 15 | 16 | 17 | ### 1. Choose `GrayCodePattern(resolution)` 18 | 19 | 20 | You can get general gray code pattern sequence with the resolution you want. 21 | 22 | ## 2. Choose `GrayCodePattern4ProjectorCalibration(resolution)` 23 | 24 | These images(1024 x 768) generated in `./output/` directory can be used directly in this paper [Projector-Camera Calibration / 3D Scanning Software](http://mesh.brown.edu/calibration/). **An opposite image of each pattern** is also be generated in order to improve the accuracy in the projector calibration. 25 | 26 | **1024 x 768 patterns** are in `output/` . 27 | -------------------------------------------------------------------------------- /grays.m: -------------------------------------------------------------------------------- 1 | function G = grays(n) 2 | % G = grays(n) is a column of 2^n distinct n-bit 3 | % integers that step through the Gray Codes running 4 | % from G(1) = 000...000 to G(2^n) = 100...000 . 5 | % Each G(j+1) is obtained from G(j) by changing 6 | % just one bit of G(j) . To see which bit, compute 7 | % whichbit = bitxor(G(j), G(j+1)) to get 2^m for a 8 | % nonnegative integer m < n . Keep n < 27 because 9 | % grays(n) costs time and memory proportional to 2^n . 10 | % See also graystep.m, int2gray.m, gray2int.m . 11 | % Display G + 2^52 in hex to see how its last n 12 | % bits change. W. Kahan, 8 July 2007 13 | 14 | n = n(:) ; T = length(n) ; 15 | if ( (T~=1)|(n~=round(n))|(n<1)|(n>26) ), N = n , 16 | error(' grays(N) needs a small positive integer N .'), end 17 | G = zeros(2^n,1) ; G(2) = 1 ; T = 2 ; 18 | for k = 2:n 19 | T2 = T+T ; ... = 2^k 20 | G(T+1:T2) = T + flipud(G(1:T)) ; 21 | T = T2 ; end 22 | 23 |  -------------------------------------------------------------------------------- /output/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/1.jpg -------------------------------------------------------------------------------- /output/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/10.jpg -------------------------------------------------------------------------------- /output/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/11.jpg -------------------------------------------------------------------------------- /output/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/12.jpg -------------------------------------------------------------------------------- /output/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/13.jpg -------------------------------------------------------------------------------- /output/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/14.jpg -------------------------------------------------------------------------------- /output/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/15.jpg -------------------------------------------------------------------------------- /output/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/16.jpg -------------------------------------------------------------------------------- /output/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/17.jpg -------------------------------------------------------------------------------- /output/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/18.jpg -------------------------------------------------------------------------------- /output/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/19.jpg -------------------------------------------------------------------------------- /output/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/2.jpg -------------------------------------------------------------------------------- /output/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/20.jpg -------------------------------------------------------------------------------- /output/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/21.jpg -------------------------------------------------------------------------------- /output/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/22.jpg -------------------------------------------------------------------------------- /output/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/23.jpg -------------------------------------------------------------------------------- /output/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/24.jpg -------------------------------------------------------------------------------- /output/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/25.jpg -------------------------------------------------------------------------------- /output/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/26.jpg -------------------------------------------------------------------------------- /output/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/27.jpg -------------------------------------------------------------------------------- /output/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/28.jpg -------------------------------------------------------------------------------- /output/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/29.jpg -------------------------------------------------------------------------------- /output/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/3.jpg -------------------------------------------------------------------------------- /output/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/30.jpg -------------------------------------------------------------------------------- /output/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/31.jpg -------------------------------------------------------------------------------- /output/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/32.jpg -------------------------------------------------------------------------------- /output/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/33.jpg -------------------------------------------------------------------------------- /output/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/34.jpg -------------------------------------------------------------------------------- /output/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/35.jpg -------------------------------------------------------------------------------- /output/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/36.jpg -------------------------------------------------------------------------------- /output/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/37.jpg -------------------------------------------------------------------------------- /output/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/38.jpg -------------------------------------------------------------------------------- /output/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/39.jpg -------------------------------------------------------------------------------- /output/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/4.jpg -------------------------------------------------------------------------------- /output/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/40.jpg -------------------------------------------------------------------------------- /output/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/41.jpg -------------------------------------------------------------------------------- /output/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/42.jpg -------------------------------------------------------------------------------- /output/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/5.jpg -------------------------------------------------------------------------------- /output/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/6.jpg -------------------------------------------------------------------------------- /output/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/7.jpg -------------------------------------------------------------------------------- /output/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/8.jpg -------------------------------------------------------------------------------- /output/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jianjieluo/GrayCodePatternSeq/1a419e9724fb97e7345238ce687d32bc540157c1/output/9.jpg --------------------------------------------------------------------------------