Commit dc61f6191879dde42a3d9f704b1511cd8cb37a93
1 parent
80d49c1c
Add multi-channel support to ut format 7
Showing
3 changed files
with
29 additions
and
22 deletions
openbr/plugins/gallery/binary.cpp
| ... | ... | @@ -231,15 +231,17 @@ class utGallery : public BinaryGallery |
| 231 | 231 | } |
| 232 | 232 | else if (ut.algorithmID == 7) { |
| 233 | 233 | // binary data consisting of a single channel matrix, of a supported type. |
| 234 | - // 3 element header: | |
| 235 | - // uint32 datatype (single channel opencv datatype code) | |
| 234 | + // 4 element header: | |
| 235 | + // uint16 datatype (single channel opencv datatype code) | |
| 236 | 236 | // uint32 matrix rows |
| 237 | 237 | // uint32 matrix cols |
| 238 | - // Followed by serialized data, in row-major order. | |
| 238 | + // uint16 matrix depth (max 512) | |
| 239 | + // Followed by serialized data, in row-major order (in r/c), with depth values | |
| 240 | + // for each layer listed in order (i.e. rgb, rgb etc.) | |
| 239 | 241 | // #### NOTE! matlab's default order is col-major, so some work should |
| 240 | 242 | // be done on the matlab side to make sure that the initial serialization is correct. |
| 241 | - uint32_t dataType = *reinterpret_cast<uint32_t*>(dataStart); | |
| 242 | - dataStart += sizeof(uint32_t); | |
| 243 | + uint16_t dataType = *reinterpret_cast<uint32_t*>(dataStart); | |
| 244 | + dataStart += sizeof(uint16_t); | |
| 243 | 245 | |
| 244 | 246 | uint32_t matrixRows = *reinterpret_cast<uint32_t*>(dataStart); |
| 245 | 247 | dataStart += sizeof(uint32_t); |
| ... | ... | @@ -247,6 +249,9 @@ class utGallery : public BinaryGallery |
| 247 | 249 | uint32_t matrixCols = *reinterpret_cast<uint32_t*>(dataStart); |
| 248 | 250 | dataStart += sizeof(uint32_t); |
| 249 | 251 | |
| 252 | + uint16_t matrixDepth= *reinterpret_cast<uint16_t*>(dataStart); | |
| 253 | + dataStart += sizeof(uint16_t); | |
| 254 | + | |
| 250 | 255 | // Set metadata |
| 251 | 256 | t.file.set("Label", ut.label); |
| 252 | 257 | t.file.set("X", ut.x); |
| ... | ... | @@ -254,7 +259,7 @@ class utGallery : public BinaryGallery |
| 254 | 259 | t.file.set("Width", ut.width); |
| 255 | 260 | t.file.set("Height", ut.height); |
| 256 | 261 | |
| 257 | - t.append(cv::Mat(matrixRows, matrixCols, CV_MAKETYPE(dataType, 1), dataStart).clone() /* We don't want a shallow copy! */); | |
| 262 | + t.append(cv::Mat(matrixRows, matrixCols, CV_MAKETYPE(dataType, matrixDepth), dataStart).clone() /* We don't want a shallow copy! */); | |
| 258 | 263 | return t; |
| 259 | 264 | } |
| 260 | 265 | else { | ... | ... |
scripts/matlab/writeUT.m
| ... | ... | @@ -9,9 +9,13 @@ function writeUT(handle, matrix, imageID, roi_x, roi_y, roi_width, roi_height, l |
| 9 | 9 | % computed values: fvSize, urlSize (url encoded as null-terminated 8-bit |
| 10 | 10 | % string, urlSize includes null terminator), a null terminator will be |
| 11 | 11 | % added to url by this function |
| 12 | +% | |
| 13 | +% For performance reasons, handle should be opened in 'W', i.e. buffered | |
| 14 | +% mode. | |
| 12 | 15 | |
| 13 | -if (size(matrix,3) ~= 1) | |
| 14 | - disp('Cannot serialize matrix, only single channel matrices are supported'); | |
| 16 | +% 512 -- max supported channels in cv::Mat | |
| 17 | +if (size(matrix,3) > 512) | |
| 18 | + disp('Cannot serialize matrix, 512 is the max depth supported'); | |
| 15 | 19 | return; |
| 16 | 20 | end |
| 17 | 21 | |
| ... | ... | @@ -35,11 +39,12 @@ end |
| 35 | 39 | % }; |
| 36 | 40 | |
| 37 | 41 | % algorithm 7 binary data format: |
| 38 | -% uint32 datatype code (copied from opencv, base datatype codes, single | |
| 42 | +% uint16 datatype code (copied from opencv, base datatype codes, single | |
| 39 | 43 | % channel is assumed) |
| 40 | 44 | % uint32 matrix rows |
| 41 | 45 | % uint32 matrix cols |
| 42 | -% row-major serialization of matrix | |
| 46 | +% uint16 channel count (max valid is 512) | |
| 47 | +% channels->rows->columns | |
| 43 | 48 | |
| 44 | 49 | % opencv data type definitions |
| 45 | 50 | % #define CV_8U 0 |
| ... | ... | @@ -134,16 +139,16 @@ fwrite(handle, fvSize, 'uint32'); |
| 134 | 139 | % url (just writing a single null byte) |
| 135 | 140 | fwrite(handle, url, 'uint8'); |
| 136 | 141 | |
| 137 | -% binary data header -- datatype code, row count, col count | |
| 138 | -fwrite(handle, type_code,'uint32'); | |
| 142 | +% binary data header -- datatype code, row count, col count, channel count | |
| 143 | +% (max 512). Datatype and channel count are uint16, dimensions are uint32 | |
| 144 | +fwrite(handle, type_code,'uint16'); | |
| 139 | 145 | fwrite(handle, uint32(size(matrix,1)), 'uint32'); |
| 140 | 146 | fwrite(handle, uint32(size(matrix,2)), 'uint32'); |
| 147 | +fwrite(handle, uint16(size(matrix,3)), 'uint16'); | |
| 141 | 148 | |
| 142 | -% write feature vector data, explicit row-major enumeration, matrix(:) is | |
| 143 | -% col-major | |
| 144 | -for i = 1:size(matrix,1) | |
| 145 | - fwrite(handle, matrix(i,:), matlab_type); | |
| 146 | -end | |
| 147 | - | |
| 148 | - | |
| 149 | +% write data, explicit row-major enumeration, matrix(:) is col-major, | |
| 150 | +% followed by depth. By permuting the dimensions, we can put the bytes in | |
| 151 | +% an appropriate order: | |
| 152 | +permuted = permute(matrix,[3,2,1]); | |
| 149 | 153 | |
| 154 | +fwrite(handle, permuted(:), matlab_type); | ... | ... |
scripts/matlab/writeUTFVectors.m
| ... | ... | @@ -5,7 +5,6 @@ function writeUTFVectors(handle, fvectors) |
| 5 | 5 | % |
| 6 | 6 | % see also writeUT |
| 7 | 7 | |
| 8 | - | |
| 9 | 8 | dummy_ID = []; |
| 10 | 9 | roi_x = uint32(0); |
| 11 | 10 | roi_y = uint32(0); |
| ... | ... | @@ -16,6 +15,4 @@ label = uint32(0); |
| 16 | 15 | urlTotal = ''; |
| 17 | 16 | for i = 1:size(fvectors,1) |
| 18 | 17 | writeUT(handle, fvectors(i,:), dummy_ID, roi_x, roi_y, roi_width, roi_height, label, urlTotal); |
| 19 | - | |
| 20 | 18 | end |
| 21 | - | ... | ... |