您的位置:首页 > 编程语言 > C语言/C++

鼠标截取图像c++风格

2014-04-25 14:07 204 查看
       本人新手一枚,最近在做视频处理方面毕设,运用鼠标截取图像对相机进行标定。确切的说是得到图像中有效像素的位置信息,为了防止非感兴趣像素的影响,所以想到先用鼠标截取图像中的一部分,进而得到相应坐标。

       在前辈dayo的博客中曾看到这方面的代码,是C风格的,但是由于博客中代码并不完整,直接粘来用不了,所以自行改为c++风格代码,完整代码如下,以供参考,欢迎指正:

#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

Mat inpaint_mask;
Mat img0 ;
Mat img;
Point prev_pt (-1,-1);
Mat segImage;
void on_mouse( int event, int x, int y, int flags, void* zhang)
{
if( !img.data )
return;
if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON) )
prev_pt = Point(-1,-1);//初始化
else if( event == CV_EVENT_LBUTTONDOWN )
prev_pt = Point(x,y);
else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON) )
{//手一直在绘画
Point pt = Point(x,y);
if( prev_pt.x < 0 )
prev_pt = pt;
line( inpaint_mask, prev_pt, pt, Scalar(255,255,255), 3, 8, 0 );
line( img, prev_pt, pt, Scalar(255,255,255), 3, 8, 0 );
prev_pt = pt;
imshow( "image", img );
imshow("ROI",inpaint_mask);
}
if(event == CV_EVENT_LBUTTONUP)
{
floodFill(inpaint_mask,Point(x,y),Scalar(255,255,255));
imshow("ROI",inpaint_mask);
}
img0.copyTo(segImage,inpaint_mask);
imshow("dst",segImage);

}

int main( int argc, char** argv )
{

img0=imread("lena.jpg");
img0.copyTo(img);
Mat mask(img.size(),img.type(),Scalar(0));
mask.copyTo(inpaint_mask);
mask.copyTo(segImage);
imshow( "image", img );
imshow("ROI",inpaint_mask);
setMouseCallback( "image", on_mouse, 0 );
waitKey();
return 0;

}


实验效果如下图:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ opencv 鼠标