«Случай — это псевдоним Бога, когда Он не хочет подписываться своим собственным именем.» А. Франс

CUDA (Проект)/Описание алгоритма работы программы — различия между версиями

Материал из Wiki
Перейти к: навигация, поиск
(Горизонтальное сравнение: - исправлены ошибки расчета координат)
м (Формат для чтения слоя)
 
(не показаны 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

Литература

Содержание

BMP формат

Рисунок 1 (Edit)

PPM формат

  • описание формата PPM
Рисунок 1 (Edit)
  • "image in top to bottom, left to right order."

Расчет координат

Горизонтальное сравнение

Рисунок 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

Проверка

C4 C5 C6
R1 XH00; YH00 XH01; YH01
32[60]; 31[-1] 25[67]; 31[-1]
XV00; YV00 200px-Yes check.png; 200px-Yes check.png XV01; YV01 Nuvola apps error.png; Nuvola apps error.png XV02; YV02
42[10]; 29[93] 43[11]; 29[93] 44[12]; 29[93]
R2 XH10; YH10 XH11; YH11
33[59]; 31[-1] 27[65]; 32[0]
XV10; YV10 Nuvola apps error.png; Nuvola apps error.png XV11; YV11 Nuvola apps error.png; 200px-Yes check.png XV12; YV12
23[-9]; 39[83] 22[-10]; 39[83] 22[-10]; 39[83]
R3 XH20; YH20 XH21; YH21
33[59]; 30[-2] 26[66]; 32[0]

Проверка четвёрок:

  • R1C4/R1C5/R2C4/R2C5:
    • ΔXV01 = ΔXH00 + ΔXV00 - ΔXH10 = 60 + 10 - 59 = 11 200px-Yes check.png
    • ΔYV01 = ΔYV00 + ΔYH00 - ΔYH10 = 93 + (-1) - (-1) = 93 200px-Yes check.png
  • R2C4/R2C5/R3C4/R3C5:
    • ΔXV11 = ΔXH10 + ΔXV10 - ΔXH20 = 59 + (-9) - 59 = -9 (-10) Nuvola apps error.png
    • ΔYV11 = ΔYV10 + ΔYH10 - ΔYH20 = 83 + (-1) - (-2) = 84 (83) Nuvola apps error.png
  • R1C5/R1C6/R2C5/R2C6:
    • ΔXV01 = 67 + 11 - 65 = 13 (12) Nuvola apps error.png
    • ΔYV01 = 93 + (-1) - 0 = 92 (93) Nuvola apps error.png
  • R2C5/R2C6/R3C5/R3C6:
    • ΔXV01 = 65 + (-10) - 66 = -11 (-10) Nuvola apps error.png
    • ΔYV01 = 83 + 0 - 0 = 83 200px-Yes check.png

Совмещение картинок

Рис. (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

NEW