imagediff.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <fvutils/statistical/imagediff.h>
00025 #include <fvutils/color/yuv.h>
00026
00027 #include <cstdlib>
00028
00029 namespace firevision {
00030 #if 0
00031 }
00032 #endif
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 ImageDiff::ImageDiff(ScanlineModel *scanline_model)
00044 {
00045 this->scanline_model = scanline_model;
00046 }
00047
00048
00049
00050
00051
00052 ImageDiff::ImageDiff()
00053 {
00054 scanline_model = NULL;
00055 }
00056
00057
00058
00059 ImageDiff::~ImageDiff()
00060 {
00061 }
00062
00063
00064
00065
00066
00067
00068
00069 void
00070 ImageDiff::setBufferA(unsigned char *yuv422planar_buffer,
00071 unsigned int width, unsigned int height)
00072 {
00073 buffer_a = yuv422planar_buffer;
00074 width_a = width;
00075 height_a = height;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 void
00085 ImageDiff::setBufferB(unsigned char *yuv422planar_buffer,
00086 unsigned int width, unsigned int height)
00087 {
00088 buffer_b = yuv422planar_buffer;
00089 width_b = width;
00090 height_b = height;
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 bool
00102 ImageDiff::different()
00103 {
00104 if ( (buffer_a == NULL) && (buffer_b == NULL) ) return false;
00105 if ( (buffer_a == NULL) && (buffer_b != NULL) ) return true;
00106 if ( (buffer_a != NULL) && (buffer_b == NULL) ) return true;
00107 if ( (width_a != width_b) || (height_a != height_b) ) return true;
00108
00109 if ( scanline_model != NULL ) {
00110
00111
00112 unsigned int x, y;
00113 unsigned char y_a, u_a, v_a, y_b, u_b, v_b;
00114
00115 scanline_model->reset();
00116 while (! scanline_model->finished() ) {
00117 x = (*scanline_model)->x;
00118 y = (*scanline_model)->y;
00119
00120 YUV422_PLANAR_YUV(buffer_a, width_a, height_a, x, y, y_a, u_a, v_a);
00121 YUV422_PLANAR_YUV(buffer_b, width_b, height_b, x, y, y_b, u_b, v_b);
00122
00123 if ( (y_a != y_b) || (u_a != u_b) || (v_a != v_b) ) {
00124 return true;
00125 }
00126 }
00127 } else {
00128
00129
00130 unsigned char *ypa = buffer_a;
00131 unsigned char *ypb = buffer_b;
00132
00133 for ( unsigned int i = 0; i < (width_a * height_a); ++i) {
00134 if ( *ypa != *ypb ) {
00135 return true;
00136 }
00137 ++ypa;
00138 ++ypb;
00139 }
00140 }
00141
00142 return false;
00143 }
00144
00145
00146
00147
00148
00149
00150
00151 unsigned int
00152 ImageDiff::numDifferingPixels()
00153 {
00154 if ( (buffer_a == NULL) && (buffer_b == NULL) ) return 0;
00155 if ( (buffer_a == NULL) && (buffer_b != NULL) ) return (width_b * height_b);
00156 if ( (buffer_a != NULL) && (buffer_b == NULL) ) return (width_a * height_a);
00157 if ( (width_a != width_b) || (height_a != height_b) ) {
00158 return abs(width_a - width_b) * abs(height_a - height_b);
00159 }
00160
00161 unsigned int num = 0;
00162 if ( scanline_model != NULL ) {
00163
00164
00165 unsigned int x, y;
00166 unsigned char y_a, u_a, v_a, y_b, u_b, v_b;
00167
00168 scanline_model->reset();
00169 while (! scanline_model->finished() ) {
00170 x = (*scanline_model)->x;
00171 y = (*scanline_model)->y;
00172
00173 YUV422_PLANAR_YUV(buffer_a, width_a, height_a, x, y, y_a, u_a, v_a);
00174 YUV422_PLANAR_YUV(buffer_b, width_b, height_b, x, y, y_b, u_b, v_b);
00175
00176 if ( (y_a != y_b) || (u_a != u_b) || (v_a != v_b) ) {
00177 ++num;
00178 }
00179 }
00180 } else {
00181
00182
00183 unsigned char *ypa = buffer_a;
00184 unsigned char *ypb = buffer_b;
00185
00186 for ( unsigned int i = 0; i < (width_a * height_a); ++i) {
00187 if ( *ypa++ != *ypb++ ) ++num;
00188 }
00189 }
00190 return num;
00191 }
00192
00193 }