2012年2月7日火曜日

OpenCVでペイント

OpenCVのテスト用

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

cv::Mat g_Canvas; // キャンバス
cv::Mat g_Palette; // 描画色
cv::Size g_CanvasWndSize(640, 480); // キャンバスサイズ
const char* g_CanvasWndName = "window";
const char* g_PalWndName = "palette";
bool g_bLBtnDown = false;
int g_TrackBarValue[3] = { 0 };  // トラックバーの値

// 指定座標にピクセル描画
void DrawPixel(cv::Mat* pMat, int x, int y, int pixelSize)
{
 cv::Scalar color(g_TrackBarValue[2], g_TrackBarValue[1], g_TrackBarValue[0]);
 cv::Point p0(x - pixelSize, y - pixelSize); 
 cv::Point p1(x + pixelSize, y + pixelSize); 
 cv::rectangle(*pMat, p0, p1, color, -1, CV_AA);
}

// マウスイベントの処理
static void onMouse(int event, int x, int y, int flag, void* ptr)
{
 switch(event) {
 case cv::EVENT_MOUSEMOVE:
  if(g_bLBtnDown) {
   // キャンバスにピクセル描画
   DrawPixel(&g_Canvas, x, y, 4);

   // 変更を反映
   cv::imshow(g_CanvasWndName, g_Canvas);
  }
  break;
 case cv::EVENT_LBUTTONDOWN:
  g_bLBtnDown = true;
  break;
 case cv::EVENT_LBUTTONUP:
  g_bLBtnDown = false;
  break;
 }
}

// 指定色で塗りつぶす
void FillColor(cv::Mat* pMat, int r, int g, int b)
{
 *pMat = cv::Scalar(b, g, r);
}

// トラックバーのイベントハンドラ
void onTrackbarRed(int val, void* ptr)
{
 g_TrackBarValue[0] = val;
 FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
 cv::imshow(g_PalWndName, g_Palette);
}
void onTrackbarGreen(int val, void* ptr)
{
 g_TrackBarValue[1] = val;
 FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
 cv::imshow(g_PalWndName, g_Palette);
}
void onTrackbarBlue(int val, void* ptr)
{
 g_TrackBarValue[2] = val;
 FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
 cv::imshow(g_PalWndName, g_Palette);
}

int main( int argc, char **argv )
{
 // Matを作成
 g_Canvas = cv::Mat(g_CanvasWndSize.height, g_CanvasWndSize.width, CV_8UC3);
 g_Palette = cv::Mat(64, 512, CV_8UC3);
 FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);

 // ウィンドウ作成
 cv::namedWindow(g_CanvasWndName, CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
 cv::namedWindow(g_PalWndName, CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
 
 // マウスのコールバック関数をセット
 cv::setMouseCallback(g_CanvasWndName, onMouse, NULL);
 
 // トラックバーをウィンドウに作成
 cv::createTrackbar("Red", g_PalWndName, &g_TrackBarValue[0], 255, onTrackbarRed, 0);
 cv::createTrackbar("Green", g_PalWndName, &g_TrackBarValue[1], 255, onTrackbarGreen, 0);
 cv::createTrackbar("Blue", g_PalWndName, &g_TrackBarValue[2], 255, onTrackbarBlue, 0);

 // ウィンドウにMatを表示
 cv::imshow(g_CanvasWndName, g_Canvas);
 cv::imshow(g_PalWndName, g_Palette);

 // キー入力待ち
 cv::waitKey(0);
 return 0;
}

0 件のコメント: