CUDA (Проект)/Описание алгоритма работы программы — различия между версиями
Материал из Wiki
ANA (обсуждение | вклад) (→Горизонтальное сравнение: - исправлены ошибки расчета координат) |
ANA (обсуждение | вклад) м (→Формат для чтения слоя) |
||
(не показаны 24 промежуточные версии 2 участников) | |||
Строка 24: | Строка 24: | ||
== Расчет координат == | == Расчет координат == | ||
+ | {{Hider|Рис. Области перекрытия при сравнении}} | ||
{| align=center | {| align=center | ||
! <html><img src="https://docs.google.com/drawings/d/1W92DU0KQbYLQDlcgS59MUKxijwtx3bpY7UiVcSzEPaM/pub?w=800"></html> | ! <html><img src="https://docs.google.com/drawings/d/1W92DU0KQbYLQDlcgS59MUKxijwtx3bpY7UiVcSzEPaM/pub?w=800"></html> | ||
Строка 29: | Строка 30: | ||
! Рисунок 2 ([https://docs.google.com/drawings/d/1W92DU0KQbYLQDlcgS59MUKxijwtx3bpY7UiVcSzEPaM/edit Edit]) | ! Рисунок 2 ([https://docs.google.com/drawings/d/1W92DU0KQbYLQDlcgS59MUKxijwtx3bpY7UiVcSzEPaM/edit Edit]) | ||
|} | |} | ||
+ | {{Hider|end}} | ||
==== Горизонтальное сравнение ==== | ==== Горизонтальное сравнение ==== | ||
Строка 38: | Строка 40: | ||
* Координаты левого верхнего угла для Tex1 при заданном смещении x и y: | * Координаты левого верхнего угла для Tex1 при заданном смещении x и y: | ||
− | ** Tex1PixelX = width - xmargin + x; | + | ** Tex1PixelX = width {{Кр|- 1}} - xmargin + x; |
** '''PPM''': Tex1PixelY = (y<yoffset) ? 0 : y {{Кр|- yoffset}} ; | ** '''PPM''': Tex1PixelY = (y<yoffset) ? 0 : y {{Кр|- yoffset}} ; | ||
** '''BMP''': Tex1PixelY = (y<yoffset) ? height {{Кр|- 1}} : (height {{Кр|- 1}}) - (y {{Кр|- yoffset}}) ; | ** '''BMP''': Tex1PixelY = (y<yoffset) ? height {{Кр|- 1}} : (height {{Кр|- 1}}) - (y {{Кр|- yoffset}}) ; | ||
Строка 79: | Строка 81: | ||
* Координаты левого верхнего угла для Tex1 при заданном смещении x и y: | * Координаты левого верхнего угла для Tex1 при заданном смещении x и y: | ||
− | ** Tex1PixelX = (x<xoffset) ? 0 : x ; | + | ** Tex1PixelX = (x<xoffset) ? 0 : x {{Кр|- xoffset}}; |
− | ** '''PPM''': Tex1PixelY = height - ymargin + y; | + | ** '''PPM''': Tex1PixelY = (height {{Кр|- 1}}) - ymargin + y; |
** '''BMP''': Tex1PixelY = ymargin - y; | ** '''BMP''': Tex1PixelY = ymargin - y; | ||
* Координаты левого верхнего угла для Tex2 при заданном смещении x и y: | * Координаты левого верхнего угла для Tex2 при заданном смещении x и y: | ||
** Tex2PixelX = (x<xoffset) ? xoffset - x : 0 ; | ** Tex2PixelX = (x<xoffset) ? xoffset - x : 0 ; | ||
** '''PPM''': Tex2PixelY = 0; | ** '''PPM''': Tex2PixelY = 0; | ||
− | ** '''BMP''': Tex2PixelY = height; | + | ** '''BMP''': Tex2PixelY = height {{Кр|- 1}}; |
* Ширина и высота поля перекрытия: | * Ширина и высота поля перекрытия: | ||
** xwidth = (x<xoffset) ? width - xoffset + x : width - (x - xoffset) ; | ** xwidth = (x<xoffset) ? width - xoffset + x : width - (x - xoffset) ; | ||
Строка 92: | Строка 94: | ||
==== Преобразование координат между PPM и BMP ==== | ==== Преобразование координат между PPM и BMP ==== | ||
* x<sup>PPM</sup> = x<sup>BMP</sup> | * x<sup>PPM</sup> = x<sup>BMP</sup> | ||
− | * y<sup>PPM</sup> = height - y<sup>BMP</sup> | + | * y<sup>PPM</sup> = height {{Кр|- 1}} - y<sup>BMP</sup> |
* x<sup>BMP</sup> = x<sup>PPM</sup> | * x<sup>BMP</sup> = x<sup>PPM</sup> | ||
− | * y<sup>BMP</sup> = height - y<sup>PPM</sup> | + | * y<sup>BMP</sup> = height {{Кр|- 1}} - y<sup>PPM</sup> |
+ | |||
+ | == Формат для чтения слоя == | ||
+ | Текстовый файл в следующем формате: | ||
+ | {{Кр|<s><Число_строк> <Число_столбцов> <Направление_обхода></s>}} | ||
+ | ; row = ''VALUE'' column= ''VALUE'' | ||
+ | ; order = ''VALUE'' | ||
+ | <Имя_картинки_1> | ||
+ | <Имя_картинки_2> | ||
+ | {{Кр|<s>#</s>}}''';''' ''комментарий'' | ||
+ | <Имя_картинки_3> | ||
+ | . . . | ||
+ | <Имя_картинки_N> | ||
+ | |||
+ | Направление обхода (order) кодируется следующим образом: | ||
+ | * 0 — слева направо, сверху вниз; | ||
+ | * 1 — слева направо, снизу вверх; | ||
+ | * 2 — сверху вниз, слева направо; | ||
+ | * 3 — снизу вверх, слева направо. | ||
+ | |||
+ | Пример файла | ||
+ | ; row =3 column=3 order = 0 | ||
+ | M1R01C4_.bmp | ||
+ | M1R01C5_.bmp | ||
+ | M1R01C6_.bmp | ||
+ | M1R02C4_.bmp | ||
+ | M1R02C5_.bmp | ||
+ | M1R02C6_.bmp | ||
+ | M1R03C4_.bmp | ||
+ | M1R03C5_.bmp | ||
+ | M1R03C6_.bmp | ||
+ | |||
+ | == Сборка картинки == | ||
+ | {| align=right | ||
+ | ! <html><img src="https://docs.google.com/drawings/d/1S_3uPeQOZaqmw3ECM0_EbLRBMvs7qUrZ3dpBPfoesKM/pub?w=500"></html> | ||
+ | |- | ||
+ | ! Рис. ([https://docs.google.com/drawings/d/1S_3uPeQOZaqmw3ECM0_EbLRBMvs7qUrZ3dpBPfoesKM/edit Edit]) | ||
+ | |} | ||
+ | <!-- | ||
+ | * ΔX<sub>V2</sub> = (ΔX<sub>V1</sub> + W - ΔX<sub>H2</sub> + W) - (W - ΔX<sub>H1</sub> + W) = ΔX<sub>V1</sub> - ΔX<sub>H2</sub> + ΔX<sub>H1</sub> | ||
+ | * ΔY<sub>V2</sub> = (H - ΔY<sub>V1</sub> + H + ΔY<sub>H2</sub> - H) - (H + ΔY<sub>H1</sub>) = - ΔY<sub>V1</sub> + ΔY<sub>H2</sub> - ΔY<sub>H1</sub> | ||
+ | --> | ||
+ | |||
+ | * ΔX<sub>V2</sub> = ΔX<sub>H1</sub> + ΔX<sub>V1</sub> - ΔX<sub>H2</sub> | ||
+ | * ΔY<sub>V2</sub> = ΔY<sub>V1</sub> + ΔY<sub>H1</sub> - ΔY<sub>H2</sub> | ||
+ | |||
+ | * ΔX<sub>H2</sub> = ΔX<sub>H1</sub> + ΔX<sub>V1</sub> - ΔX<sub>V2</sub> | ||
+ | * ΔY<sub>H2</sub> = ΔY<sub>V2</sub> + ΔY<sub>H1</sub> - ΔY<sub>V1</sub> | ||
+ | |||
+ | Обозначения: | ||
+ | * ΔX<sub>H*</sub> = XMARGIN | ||
+ | * ΔY<sub>V*</sub> = YMARGIN | ||
+ | * ΔX<sub>V*</sub> = XOFFSET | ||
+ | * ΔY<sub>H*</sub> = YOFFSET | ||
+ | |||
+ | ==== Проверка ==== | ||
+ | |||
+ | {| class=standard align=center | ||
+ | ! || C4 || || C5 || || C6 | ||
+ | |- | ||
+ | ! rowspan=2| R1 | ||
+ | | rowspan=2| || X<sub>H00</sub>; Y<sub>H00</sub> || rowspan=2| || X<sub>H01</sub>; Y<sub>H01</sub> ||rowspan=2| | ||
+ | |- | ||
+ | | 32[60]; 31[-1] || 25[67]; 31[-1] | ||
+ | |- | ||
+ | ! rowspan=2| | ||
+ | | X<sub>V00</sub>; Y<sub>V00</sub> ||rowspan=2 align=center| {{V|16px}}; {{V|16px}} || X<sub>V01</sub>; Y<sub>V01</sub> ||rowspan=2 align=center| {{X|16px}}; {{X|16px}} || X<sub>V02</sub>; Y<sub>V02</sub> | ||
+ | |- | ||
+ | | 42[10]; 29[93] || 43[11]; 29[93] || 44[12]; 29[93] | ||
+ | |- | ||
+ | ! rowspan=2| R2 | ||
+ | | rowspan=2| || X<sub>H10</sub>; Y<sub>H10</sub> || rowspan=2| || X<sub>H11</sub>; Y<sub>H11</sub> ||rowspan=2| | ||
+ | |- | ||
+ | | 33[59]; 31[-1] || 27[65]; 32[0] | ||
+ | |- | ||
+ | ! rowspan=2| | ||
+ | | X<sub>V10</sub>; Y<sub>V10</sub> ||rowspan=2 align=center| {{X|16px}}; {{X|16px}} || X<sub>V11</sub>; Y<sub>V11</sub> ||rowspan=2 align=center| {{X|16px}}; {{V|16px}} || X<sub>V12</sub>; Y<sub>V12</sub> | ||
+ | |- | ||
+ | | 23[-9]; 39[83] || 22[-10]; 39[83] || 22[-10]; 39[83] | ||
+ | |- | ||
+ | ! rowspan=2| R3 | ||
+ | | rowspan=2| || X<sub>H20</sub>; Y<sub>H20</sub> || rowspan=2| || X<sub>H21</sub>; Y<sub>H21</sub> ||rowspan=2| | ||
+ | |- | ||
+ | | 33[59]; 30[-2] || 26[66]; 32[0] | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | Проверка четвёрок: | ||
+ | * '''R1C4/R1C5/R2C4/R2C5''': | ||
+ | ** ΔX<sub>V01</sub> = ΔX<sub>H00</sub> + ΔX<sub>V00</sub> - ΔX<sub>H10</sub> = 60 + 10 - 59 = 11 {{V|16px}} | ||
+ | ** ΔY<sub>V01</sub> = ΔY<sub>V00</sub> + ΔY<sub>H00</sub> - ΔY<sub>H10</sub> = 93 + (-1) - (-1) = 93 {{V|16px}} | ||
+ | * '''R2C4/R2C5/R3C4/R3C5''': | ||
+ | ** ΔX<sub>V11</sub> = ΔX<sub>H10</sub> + ΔX<sub>V10</sub> - ΔX<sub>H20</sub> = 59 + (-9) - 59 = -9 (-10) {{X|16px}} | ||
+ | ** ΔY<sub>V11</sub> = ΔY<sub>V10</sub> + ΔY<sub>H10</sub> - ΔY<sub>H20</sub> = 83 + (-1) - (-2) = 84 (83) {{X|16px}} | ||
+ | * '''R1C5/R1C6/R2C5/R2C6''': | ||
+ | ** ΔX<sub>V01</sub> = 67 + 11 - 65 = 13 (12) {{X|16px}} | ||
+ | ** ΔY<sub>V01</sub> = 93 + (-1) - 0 = 92 (93) {{X|16px}} | ||
+ | * '''R2C5/R2C6/R3C5/R3C6''': | ||
+ | ** ΔX<sub>V01</sub> = 65 + (-10) - 66 = -11 (-10) {{X|16px}} | ||
+ | ** ΔY<sub>V01</sub> = 83 + 0 - 0 = 83 {{V|16px}} | ||
+ | |||
+ | == Совмещение картинок == | ||
+ | |||
+ | {| align=center | ||
+ | ! <html><img src="https://docs.google.com/drawings/d/1XpaqJUlcVGQedO0LZkZArIEqL0b7ZNHvVvm7LyFLyBo/pub?w=800"></html> | ||
+ | |- | ||
+ | ! Рис. ([https://docs.google.com/drawings/d/1XpaqJUlcVGQedO0LZkZArIEqL0b7ZNHvVvm7LyFLyBo/edit Edit]) | ||
+ | |} | ||
+ | |||
+ | ===Сборка общего изображения=== | ||
+ | {| align=center | ||
+ | ! <html><img src="https://docs.google.com/drawings/d/12OwcQYmn58AEZOkQhriTdMVyO3gHkuMmefuGjFbRsGM/pub?w=385&h=261"></html> | ||
+ | |- | ||
+ | ! Рисунок 1 ([https://docs.google.com/drawings/d/12OwcQYmn58AEZOkQhriTdMVyO3gHkuMmefuGjFbRsGM/edit Edit]) | ||
+ | |} | ||
+ | {| align=center | ||
+ | ! <html><img src="https://docs.google.com/drawings/d/15g-ru8tU1SFngH1Zmr5v46bikOFW9Ic29oaBvVcyKg8/pub?w=385&h=261"></html> | ||
+ | |- | ||
+ | ! Рисунок 2 ([https://docs.google.com/drawings/d/15g-ru8tU1SFngH1Zmr5v46bikOFW9Ic29oaBvVcyKg8/edit Edit]) | ||
+ | |} | ||
+ | |||
+ | ====Расчёт координат левого верхнего угла для каждой текстуры==== | ||
+ | |||
+ | <source lang="cpp"> | ||
+ | YTex[0][0] = 0; | ||
+ | XTex[0][0] = 0; | ||
+ | for(j = 1; j < cols; j++){ | ||
+ | YTex[0][j] = YTex[0][j-1] + Yh[0][j-1]; | ||
+ | XTex[0][j] = XTex[0][j-1] + width - Xh[0][j-1]; | ||
+ | } | ||
+ | for(int i = 1; i < rows; i++){ | ||
+ | XTex[i][0] = XTex[i-1][0] + Xv[i-1][0]; | ||
+ | YTex[i][0] = YTex[i-1][0] + height - Yv[i-1][0]; | ||
+ | for(j = 1; j < cols; j++){ | ||
+ | XTex[i][j] = XTex[i][j-1] + width - Xh[i][j-1]; | ||
+ | YTex[i][j] = YTex[i-1][j] + height - Yv[i-1][j]; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ====Расчёт высоты и ширины общего изображения==== | ||
+ | *widthA = XTex[0][cols-1] + width; | ||
+ | *heightA = YTex[rows-1][0] + height; | ||
+ | |||
+ | ====Расчёт координат с учётом положения в общей текстуре==== | ||
+ | *XC = (XTex + x)/widthA; | ||
+ | *YC = (YTex + y)/heightA; | ||
+ | *xf = x/width; | ||
+ | *yf = y/height; | ||
+ | |||
+ | ====Расчёт градиента для областей перекрытия==== | ||
+ | *t0 = t1 = 1.0f; | ||
+ | *if(x < Xh) | ||
+ | **t1 = x/Xh; | ||
+ | *if(y < Yv){ | ||
+ | **yt1 = y/Yv; | ||
+ | **t1 = t1*yt1; | ||
+ | *} | ||
+ | *if((x>=Xh) & (y>=Yv))t1=1.0f; | ||
+ | *t0=1.0f-t1; | ||
+ | |||
+ | ====Сохранение текущего изображения в итоговую текстуру==== | ||
+ | |||
+ | *PixelC[XC][YC] = PixelC[XC][YC]*t0 + PixelC[xf][yf]*t1; | ||
+ | |||
+ | === Пример запуска программы из командной строки === | ||
+ | ./compareBMP ../../data/impinj/m1/m1_3x3.dat --xmargin 60 --ymargin 90 --offset 32 | ||
+ | |||
+ | ./compareBMP ../../data/impinj/m1/m1_3x4.dat --xmargin 60 --ymargin 90 --offset 32 | ||
+ | Вывод на последнюю команду | ||
+ | <pre> | ||
+ | fset 32 | ||
+ | xmarg = 60, ymarg = 90, offset = 32, path = ../../data/impinj/m1/m1_3x4.dat | ||
+ | cols = 4, rows = 3, mode = 0 | ||
+ | XH00 = 60 YH00 = -1 | ||
+ | XV00 = 10 YV00 = 93 | ||
+ | XH01 = 67 YH01 = -1 | ||
+ | XV01 = 11 YV01 = 93 | ||
+ | XH02 = 61 YH02 = -1 | ||
+ | XV02 = 12 YV02 = 93 | ||
+ | XV03 = -1 YV03 = 92 | ||
+ | XH10 = 59 YH10 = -1 | ||
+ | XV10 = -9 YV10 = 83 | ||
+ | XH11 = 65 YH11 = 0 | ||
+ | XV11 = -10 YV11 = 83 | ||
+ | XH12 = 72 YH12 = -1 | ||
+ | XV12 = -10 YV12 = 83 | ||
+ | XV13 = 1 YV13 = 84 | ||
+ | XH20 = 59 YH20 = -2 | ||
+ | XH21 = 66 YH21 = 0 | ||
+ | XH22 = 61 YH22 = -1 | ||
+ | </pre> | ||
+ | |||
+ | == NEW == |
Текущая версия на 12:05, 25 сентября 2014
Проект CUDA
- Техническое задание
- DDS формат
- Алгоритм сшифки кадров
- Описание программы GLView
Литература
Содержание |
BMP формат
|
---|
Рисунок 1 (Edit) |
PPM формат
- описание формата PPM
|
---|
Рисунок 1 (Edit) |
- "image in top to bottom, left to right order."
Расчет координат
Рис. Области перекрытия при сравнении
|
---|
Рисунок 2 (Edit) |
Горизонтальное сравнение
|
---|
Рисунок 3a (Edit) |
- Координаты левого верхнего угла для Tex1 при заданном смещении x и y:
- Tex1PixelX = width - 1 - xmargin + x;
- PPM: Tex1PixelY = (y<yoffset) ? 0 : y - yoffset ;
- BMP: Tex1PixelY = (y<yoffset) ? height - 1 : (height - 1) - (y - yoffset) ;
- Координаты левого верхнего угла для Tex2 при заданном смещении x и y:
- Tex2PixelX = 0;
- PPM: Tex2PixelY = (y<yoffset) ? yoffset - y : 0 ;
- BMP: Tex2PixelY = (y<yoffset) ? (height - 1) - (yoffset - y) : height - 1 ;
- Ширина и высота поля перекрытия:
- xwidth = xmargin - x;
- yheight = (y<yoffset) ? height - yoffset + y : height - (y - yoffset) ;
pixel = xwidth * yheight ; for (div = 0; div < xwidth ; div++) { Tex1CoorXf = (Tex1PixelX + divx) / (float) width; Tex2CoorXf = (Tex2PixelX + divx) / (float) width; for (divy = 0; divy < yheight ; divy++) { Tex1CoorYf = (Tex1PixelY + divy) / (float) {{Кр|height}}; Tex2CoorYf = (Tex2PixelY + divy) / (float) {{Кр|height}}; Tex1Pixel = tex2D(tex1, Tex1CoorXf, Tex1CoorYf); Tex2Pixel = tex2D(tex2, Tex2CoorXf, Tex2CoorYf); ErrorSum += PixelSub(Tex1Pixel, Tex1Pixel); } } ErrorSum = ErrorSum/pixel; dM[x,y] = ErrorSum;
Вертикальное сравнение
|
---|
Рисунок 3b (Edit) |
- Координаты левого верхнего угла для Tex1 при заданном смещении x и y:
- Tex1PixelX = (x<xoffset) ? 0 : x - xoffset;
- PPM: Tex1PixelY = (height - 1) - ymargin + y;
- BMP: Tex1PixelY = ymargin - y;
- Координаты левого верхнего угла для Tex2 при заданном смещении x и y:
- Tex2PixelX = (x<xoffset) ? xoffset - x : 0 ;
- PPM: Tex2PixelY = 0;
- BMP: Tex2PixelY = height - 1;
- Ширина и высота поля перекрытия:
- xwidth = (x<xoffset) ? width - xoffset + x : width - (x - xoffset) ;
- yheight = ymargin - y;
Преобразование координат между PPM и BMP
- xPPM = xBMP
- yPPM = height - 1 - yBMP
- xBMP = xPPM
- yBMP = height - 1 - yPPM
Формат для чтения слоя
Текстовый файл в следующем формате:
<Число_строк> <Число_столбцов> <Направление_обхода>; row = VALUE column= VALUE ; order = VALUE <Имя_картинки_1> <Имя_картинки_2>#; комментарий <Имя_картинки_3> . . . <Имя_картинки_N>
Направление обхода (order) кодируется следующим образом:
- 0 — слева направо, сверху вниз;
- 1 — слева направо, снизу вверх;
- 2 — сверху вниз, слева направо;
- 3 — снизу вверх, слева направо.
Пример файла
; row =3 column=3 order = 0 M1R01C4_.bmp M1R01C5_.bmp M1R01C6_.bmp M1R02C4_.bmp M1R02C5_.bmp M1R02C6_.bmp M1R03C4_.bmp M1R03C5_.bmp M1R03C6_.bmp
Сборка картинки
|
---|
Рис. (Edit) |
- ΔXV2 = ΔXH1 + ΔXV1 - ΔXH2
- ΔYV2 = ΔYV1 + ΔYH1 - ΔYH2
- ΔXH2 = ΔXH1 + ΔXV1 - ΔXV2
- ΔYH2 = ΔYV2 + ΔYH1 - ΔYV1
Обозначения:
- ΔXH* = XMARGIN
- ΔYV* = YMARGIN
- ΔXV* = XOFFSET
- ΔYH* = YOFFSET
Проверка
Проверка четвёрок:
- R1C4/R1C5/R2C4/R2C5:
- R2C4/R2C5/R3C4/R3C5:
- R1C5/R1C6/R2C5/R2C6:
- R2C5/R2C6/R3C5/R3C6:
Совмещение картинок
|
---|
Рис. (Edit) |
Сборка общего изображения
|
---|
Рисунок 1 (Edit) |
|
---|
Рисунок 2 (Edit) |
Расчёт координат левого верхнего угла для каждой текстуры
YTex[0][0] = 0; XTex[0][0] = 0; for(j = 1; j < cols; j++){ YTex[0][j] = YTex[0][j-1] + Yh[0][j-1]; XTex[0][j] = XTex[0][j-1] + width - Xh[0][j-1]; } for(int i = 1; i < rows; i++){ XTex[i][0] = XTex[i-1][0] + Xv[i-1][0]; YTex[i][0] = YTex[i-1][0] + height - Yv[i-1][0]; for(j = 1; j < cols; j++){ XTex[i][j] = XTex[i][j-1] + width - Xh[i][j-1]; YTex[i][j] = YTex[i-1][j] + height - Yv[i-1][j]; } }
Расчёт высоты и ширины общего изображения
- widthA = XTex[0][cols-1] + width;
- heightA = YTex[rows-1][0] + height;
Расчёт координат с учётом положения в общей текстуре
- XC = (XTex + x)/widthA;
- YC = (YTex + y)/heightA;
- xf = x/width;
- yf = y/height;
Расчёт градиента для областей перекрытия
- t0 = t1 = 1.0f;
- if(x < Xh)
- t1 = x/Xh;
- if(y < Yv){
- yt1 = y/Yv;
- t1 = t1*yt1;
- }
- if((x>=Xh) & (y>=Yv))t1=1.0f;
- t0=1.0f-t1;
Сохранение текущего изображения в итоговую текстуру
- PixelC[XC][YC] = PixelC[XC][YC]*t0 + PixelC[xf][yf]*t1;
Пример запуска программы из командной строки
./compareBMP ../../data/impinj/m1/m1_3x3.dat --xmargin 60 --ymargin 90 --offset 32
./compareBMP ../../data/impinj/m1/m1_3x4.dat --xmargin 60 --ymargin 90 --offset 32
Вывод на последнюю команду
fset 32 xmarg = 60, ymarg = 90, offset = 32, path = ../../data/impinj/m1/m1_3x4.dat cols = 4, rows = 3, mode = 0 XH00 = 60 YH00 = -1 XV00 = 10 YV00 = 93 XH01 = 67 YH01 = -1 XV01 = 11 YV01 = 93 XH02 = 61 YH02 = -1 XV02 = 12 YV02 = 93 XV03 = -1 YV03 = 92 XH10 = 59 YH10 = -1 XV10 = -9 YV10 = 83 XH11 = 65 YH11 = 0 XV11 = -10 YV11 = 83 XH12 = 72 YH12 = -1 XV12 = -10 YV12 = 83 XV13 = 1 YV13 = 84 XH20 = 59 YH20 = -2 XH21 = 66 YH21 = 0 XH22 = 61 YH22 = -1