コード例 #1
0
/*!
	市松模様を書き込む
	@param[in,out] img 書き込み先 3or4 ch
	@param[in] color1 色1 rgb
	@param[in] color2 色2 rgb
	@param[in] block_size 模様のブロックサイズ 2^(block_size)の大きさになる
	@param[in] lprc 書き込み先範囲
*/
void CheckerImageRect(IplImage* img, const UCvPixel* color1, const UCvPixel* color2, int block_size, LPRECT lprc)
{
	assert( img->nChannels == 3 || img->nChannels == 4 );

	RECT rc;
	if(lprc){
		rc.left  = (lprc->left < lprc->right) ? lprc->left : lprc->right;
		rc.right = (lprc->left < lprc->right) ? lprc->right : lprc->left;
		rc.top   = (lprc->top < lprc->bottom) ? lprc->top : lprc->bottom;
		rc.bottom = (lprc->top < lprc->bottom) ? lprc->bottom : lprc->top;
	}
	else{
		rc.left = 0;
		rc.right = img->width;
		rc.top = 0;
		rc.bottom = img->height;
	}

	if (rc.right - rc.left == 0) return;
	if (rc.bottom - rc.top == 0) return;

	if(img->nChannels == 4){
		int m, n;
		int x, y;
		UCvPixel *pix;
		UCvPixel *line = GetPixelAddress32(img, rc.left, rc.top);
		for(y=rc.top; y<rc.bottom; y++){
			n = y >> block_size;
			pix = line;
			for(x=rc.left; x<rc.right; x++){
				m = x >> block_size;

				if((n&0x1) == (m&0x1)){
					pix->value = color1->value;
				}
				else{
					pix->value = color2->value;
				}
				pix++;
			}
			line = GetNextLineAddress32(img, line);
		}
	}
コード例 #2
0
_EXPORT double GetMaxAbsDiff(const IplImage* img1, const IplImage* img2)
{
	assert(img1->width == img2->width);
	assert(img1->height == img2->height);
	assert(img1->nChannels == img2->nChannels);

	if (img1->nChannels == 4) {
		double max_abs_diff = 0.0;
		int x,y;
		UCvPixel* pix1;
		UCvPixel* pix2;
		UCvPixel* line1;
		UCvPixel* line2;
		line1 = GetPixelAddress32(img1, 0, 0);
		line2 = GetPixelAddress32(img2, 0, 0);
		for (y = 0; y < img1->height; y++) {
			pix1 = line1;
			pix2 = line2;
			for (x = 0; x < img1->width; x++) {
				int dif_b = pix1->b - pix2->b;
				int dif_g = pix1->g - pix2->g;
				int dif_r = pix1->r - pix2->r;
				int dif_a = pix1->a - pix2->a;

				dif_b *= ((double)max(pix1->a, pix2->a)/255.0);
				dif_g *= ((double)max(pix1->a, pix2->a)/255.0);
				dif_r *= ((double)max(pix1->a, pix2->a)/255.0);

				double abs_diff = sqrt((double)(dif_b*dif_b + dif_g*dif_g + dif_r*dif_r + dif_a*dif_a));
				if (abs_diff > max_abs_diff) {
					max_abs_diff = abs_diff;
				}

				pix1++;
				pix2++;
			}
			line1 = GetNextLineAddress32(img1, line1);
			line2 = GetNextLineAddress32(img2, line2);
		}
		return max_abs_diff;
	}
	else if (img1->nChannels == 3) {
		double max_abs_diff = 0.0;
		int x,y;
		UCvBGR* pix1;
		UCvBGR* pix2;
		UCvBGR* line1;
		UCvBGR* line2;
		line1 = GetPixelAddress24(img1, 0, 0);
		line2 = GetPixelAddress24(img2, 0, 0);
		for (y = 0; y < img1->height; y++) {
			pix1 = line1;
			pix2 = line2;
			for (x = 0; x < img1->width; x++) {
				int dif_b = pix1->b - pix2->b;
				int dif_g = pix1->g - pix2->g;
				int dif_r = pix1->r - pix2->r;

				double abs_diff = sqrt((double)(dif_b*dif_b + dif_g*dif_g + dif_r*dif_r));
				if (abs_diff > max_abs_diff) {
					max_abs_diff = abs_diff;
				}

				pix1++;
				pix2++;
			}
			line1 = GetNextLineAddress24(img1, line1);
			line2 = GetNextLineAddress24(img2, line2);
		}
		return max_abs_diff;
	}
	else if (img1->nChannels == 1) {
		double max_abs_diff = 0.0;
		int x,y;
		uint8_t* pix1;
		uint8_t* pix2;
		uint8_t* line1;
		uint8_t* line2;
		line1 = GetPixelAddress(img1, 0, 0);
		line2 = GetPixelAddress(img2, 0, 0);
		for (y = 0; y < img1->height; y++) {
			pix1 = line1;
			pix2 = line2;
			for (x = 0; x < img1->width; x++) {
				int dif = (*pix1) - (*pix2);

				double abs_diff = sqrt((double)dif*dif);
				if (abs_diff > max_abs_diff) {
					max_abs_diff = abs_diff;
				}

				pix1++;
				pix2++;
			}
			line1 = GetNextLineAddress(img1, line1);
			line2 = GetNextLineAddress(img2, line2);
		}
		return max_abs_diff;
	}
	else {
		assert(0);
	}
}