calibrateFunctions.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "Image/calibrateFunctions.H"
00038
00039 #include "Image/Image.H"
00040 #include "Util/Assert.H"
00041 #include <iostream>
00042 #include <vector>
00043
00044 double getError (const Image<byte>& img1,
00045 const Image<byte>& img2,
00046 const int shiftx, const int shifty)
00047 {
00048 ASSERT(img1.isSameSize(img2));
00049
00050 int w = img1.getWidth();
00051 int h = img1.getHeight();
00052
00053 int xb1, xe1, xb2, xe2;
00054 if (shiftx < 0)
00055 {
00056 xb1 = 0; xe1 = w + shiftx;
00057 xb2 = -shiftx; xe2 = w;
00058 }
00059 else
00060 {
00061 xb1 = shiftx; xe1 = w;
00062 xb2 = 0; xe2 = w - shiftx;
00063 }
00064 ASSERT((xb1 < xe1) && (xb2 < xe2));
00065
00066 int yb1, ye1, yb2, ye2;
00067 if (shifty < 0)
00068 {
00069 yb1 = 0; ye1 = h + shifty;
00070 yb2 = -shifty; ye2 = h;
00071 }
00072 else
00073 {
00074 yb1 = shifty; ye1 = h;
00075 yb2 = 0; ye2 = h - shifty;
00076 }
00077 ASSERT((yb1 < ye1) && (yb2 < ye2));
00078
00079 double sum = 0.0, diff;
00080 Image<byte>::const_iterator ptr1 = img1.begin() + (xb1 + yb1 * w);
00081 Image<byte>::const_iterator ptr2 = img2.begin() + (xb2 + yb2 * w);
00082
00083 for (int y = yb1; y < ye1; y++)
00084 {
00085 Image<byte>::const_iterator ptr1b = ptr1;
00086 Image<byte>::const_iterator ptr2b = ptr2;
00087 for (int x = xb1; x < xe1; x++)
00088 {
00089 diff = double(*ptr1b++) - double(*ptr2b++);
00090 sum += diff * diff;
00091 }
00092 ptr1 += w; ptr2 += w;
00093 }
00094
00095 return sum / (xe1 - xb1) / (ye1 - yb1);
00096 }
00097
00098
00099 int findAlign(const Image<byte>& img1,
00100 const Image<byte>& img2,
00101 const int align_xy,
00102 const int range_start,
00103 const int range_end)
00104 {
00105 ASSERT((img1.isSameSize(img2)));
00106 ASSERT((align_xy == 0) || (align_xy == 1));
00107 int dim[2], shift[2];
00108 dim[0] = img1.getWidth();
00109 dim[1] = img1.getHeight();
00110 shift[0] = 0; shift[1] = 0;
00111
00112
00113 ASSERT((range_start < range_end) && (range_start > -dim[align_xy]) &&
00114 (range_end < dim[align_xy]));
00115
00116 int num_elem = range_end - range_start;
00117
00118 std::vector<double> err(num_elem+1);
00119 for (int i=0; i<= num_elem; i++)
00120 err[i] = -1.0;
00121
00122 int left, right, middle, mid_l, mid_r;
00123
00124 left = 0; shift[align_xy] = left + range_start;
00125 err[left] = getError(img1,img2,shift[0],shift[1]);
00126
00127 right = num_elem; shift[align_xy] = right + range_start;
00128 err[right] = getError(img1,img2,shift[0],shift[1]);
00129
00130 middle = num_elem / 2; shift[align_xy] = middle + range_start;
00131 err[middle] = getError(img1,img2,shift[0],shift[1]);
00132
00133 while ((left != middle) && (middle != right))
00134 {
00135 mid_l = (left + middle) / 2;
00136 if (err[mid_l] < 0)
00137 {
00138 shift[align_xy] = mid_l + range_start;
00139 err[mid_l] = getError(img1,img2,shift[0],shift[1]);
00140 }
00141
00142 mid_r = (middle + right) / 2;
00143 if (err[mid_r] < 0)
00144 {
00145 shift[align_xy] = mid_r + range_start;
00146 err[mid_r] = getError(img1,img2,shift[0],shift[1]);
00147 }
00148 if ((err[middle] < err[mid_l]) && (err[middle] < err[mid_r]))
00149 {
00150 left = mid_l;
00151 right = mid_r;
00152 }
00153 else if (err[mid_l] < err[mid_r])
00154 {
00155 right = middle;
00156 middle = mid_l;
00157 }
00158 else
00159 {
00160 left = middle;
00161 middle = mid_r;
00162 }
00163 }
00164 return middle + range_start;
00165 }
00166
00167
00168
00169
00170
00171