#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;
}
2012年2月7日火曜日
OpenCVでペイント
OpenCVのテスト用
登録:
コメントの投稿 (Atom)
0 件のコメント:
新しいコメントは書き込めません。