画素値を画面表示する
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]); } }