画素値を画面表示する

OpenCV 2.0 で作った.マウスカーソルを合わせた位置の座標と画素値を画面表示する.テスト画像は カラー画像の画素にアクセス - BiBoLoG で使った画像を拡大した.

bgrview.cpp

マウスは cvSetMouseCallback() で観測する.opencv.pdf や opencv.jp - OpenCV: シンプルGUI(Simple GUI)サンプルコード - を参照すると,使用法が分かる.

画素値取得に bgr.step でなく, bgr.cols と書いていて,これで詰まった.cols でもいーんだけど 3 倍しなきゃね.

#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

#ifdef _DEBUG
#pragma comment( lib, "cv200d.lib" )
#pragma comment( lib, "cxcore200d.lib" )
#pragma comment( lib, "highgui200d.lib" )
#else
#pragma comment( lib, "cv200.lib" )
#pragma comment( lib, "cxcore200.lib" )
#pragma comment( lib, "highgui200.lib" )
#endif

// 画像表示ウインドウ名
const char *window_name = "画像プレビュー";
// 画像
cv::Mat bgr;

// usage を画面表示
void printUsage( const char *filename = NULL )
{
	printf("\n");
	printf("パラメータ\n");
	if ( filename )
	{
		printf("\tbgrview.exe %s\n", filename);
	}else{
		printf("\tbgrview.exe 画像ファイル\n");
	}
	printf("\n");
	printf("マウスカーソルを合わせた座標の画素値を画面表示する.\n");
	printf("\n");
	printf("凡例\n");
	printf("座標(x軸, y軸): 画素値(B, G, R)\n");
	printf("\n");
}

// パラメータチェック
bool isArgOK( int argc, char *argv[] )
{ 
	if ( argc < 1 )
	{
		printf("引数不足\n");
		return false;
	}
	return true;
}

void on_mouse( int event, int x, int y, int flags, void *param )
{
	if ( event == CV_EVENT_MOUSEMOVE )
	{
		unsigned char p[3];
		p[0] = bgr.data[3 * x + bgr.step * y + 0];
		p[1] = bgr.data[3 * x + bgr.step * y + 1];
		p[2] = bgr.data[3 * x + bgr.step * y + 2];
		printf("(%4d, %4d): ( %4u, %4u, %4u )\n", x, y, p[0], p[1], p[2]);
	}
}

int main ( int argc, char *argv[] )
{
	// パラメータチェック
	if ( isArgOK == false )
	{
		printUsage();
		return 0;
	}
	// 画像読込
	bgr = cv::imread(argv[1]);
	if ( bgr.empty() == true )
	{
		printf("読込不能: %s\n", argv[1]);
		printUsage( argv[1] );
		return 0;
	}

	printUsage( argv[1] );

	cv::namedWindow( window_name, CV_WINDOW_AUTOSIZE );
	cv::imshow( window_name, bgr );
	cvSetMouseCallback( window_name, on_mouse);
	cv::waitKey();
	

	return 0;
}
on_mouse の別バージョン

画素値取り出しにマクロを使用する.

#define PX(im,x,y,c) im.data[ 3 * x + im.step * y + c]
void on_mouse( int event, int x, int y, int flags, void *param )
{
	if ( event == CV_EVENT_MOUSEMOVE )
	{
		unsigned char p[3];
		p[0] = PX(yiq,x,y,0);
		p[1] = PX(yiq,x,y,1);
		p[2] = PX(yiq,x,y,2);
		printf("(%4d, %4d): ( %4u, %4u, %4u )\n", x, y, p[0], p[1], p[2]);
	}
}