您的位置:首页 > 运维架构

OpenCV记录鼠标左键点击位置

2016-01-13 20:17 489 查看
如题,最近要帮师兄做一些图片标记的工作,很繁琐。写了些很简短的程序,放着吧,省的以后自己再用给弄丢了。

如下,程序完成的主要功能是:打开一个窗口,填充一张纯黑图片,但你在窗口中点击鼠标左键时,点击处会用红点标记,同时鼠标点击处的坐标值输出到.txt文件中。

不多说,上源码:

//---------------------------------【头文件、命名空间包含部分】-----------------------------
//      描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <fstream>
using namespace cv;
using namespace std;

//-----------------------------------【宏定义部分】--------------------------------------------
//  描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------
#define WINDOW_NAME "【程序窗口】"        //为窗口标题定义的宏

//-----------------------------------【全局函数声明部分】------------------------------------
//      描述:全局函数的声明
//------------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawLine( cv::Mat& img, cv::Point pt );

//-----------------------------------【全局变量声明部分】-----------------------------------
//      描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
Point g_pt;
//初始化
ofstream OutFile("out.txt", ios::out|ios::binary);
//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{

//【1】准备参数
g_pt = Point(0, 0);
Mat srcImage(1024, 576,CV_8UC3);
srcImage = Scalar::all(0);//黑色

//【2】设置鼠标操作回调函数
namedWindow( WINDOW_NAME );
setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);

//【3】程序主循环,当进行绘制的标识符为真时,进行绘制
while(1)
{
imshow( WINDOW_NAME, srcImage );
if( waitKey( 10 ) == 27 ) break;//按下ESC键,程序退出
}
OutFile.close();
return 0;
}

//--------------------------------【on_MouseHandle( )函数】-----------------------------
//      描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
//-----------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

Mat& image = *(cv::Mat*) param;
switch(event)
{
//左键按下消息
case EVENT_LBUTTONDOWN:
{
g_pt = Point(x, y);
OutFile << g_pt.x << "  " << g_pt.y << endl;
//调用函数进行绘制
DrawLine( image, g_pt );//画线
}
break;
}
}

void DrawLine( cv::Mat& img, cv::Point pt )
{
cv::line(img, pt, pt, cv::Scalar(0, 0, 255));//随机颜色
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: