/*用鼠标在图像上画一个矩形*/
#include "stdafx.h"
#include "highgui.h"
using namespace cv;
void rect_mousecallback( int event, int x, int y, int flags, void* param); //画矩形的回调函数原型
CvRect box; // 被rect_mousecallback 用来确定鼠标图画框大小的的全局变量
bool drawing_box = false; //绘图标志
void draw_box(IplImage* img, CvRect rect) //教程中没有使用rect参数,用的全局变量box
{
cvRectangle(img,
cvPoint(rect.x,rect.y),
cvPoint(rect.x + rect.width, rect.y + rect.height),
CV_RGB(0,0xff,0)); //cvScalar的宏
// cvScalar(0,0,0xff)); //red
}
int _tmain(int argc, _TCHAR* argv[])
{
//初始化
char* winname="box example"; //窗口名
char* filename="E:\\iVew\\AB\\01.jpg";
IplImage* img = cvLoadImage(filename);
box = cvRect(-1,-1,0,0);
IplImage* temp = cvCloneImage(img); //创建临时图像,初始化用cvCloneImage,此函数会分配空间,运行中用cvCopy,此函数不分配新的空间
cvNamedWindow(winname); //注册回调函数之前要先声明window
cvSetMouseCallback(winname, //***安装回调函数
rect_mousecallback,
(void*) img); // 函数原型要求最后一个参数必须是void*,所以不管传入的参数是什么指针类型,都要强制转换.
while(1)
{
cvCopy(img,temp); //cvCopy只复制值,不会分配新空间给temp,所以指针位置不变. 教程中有错误,cvCopyImage()函数未定义
//reference http://blog.youkuaiyun.com/jajen/article/details/5711678
if(drawing_box) draw_box(temp,box);
cvShowImage(winname,temp);
if(cvWaitKey(15) == 27) break;
}
cvReleaseImage(&img);
cvReleaseImage(&temp);
cvDestroyWindow(winname);
exit(0);
}
//鼠标回调函数实现
void rect_mousecallback( int event, int x, int y, int flags, void* param)
{
IplImage* img = (IplImage*) param; //将setMouseCallback传入的param参数指针转化为原来的类型
switch(event)
{
case CV_EVENT_MOUSEMOVE:
{
if(drawing_box)
{
box.width = x - box.x;
box.height = y- box.height;
}
}
break;
case CV_EVENT_LBUTTONDOWN:
{
drawing_box = true;
box = cvRect(x,y,0,0);
}
break;
case CV_EVENT_LBUTTONUP:
{
drawing_box = false;
if(box.width<0)
{
box.x += box.width;
box.width *= -1;
}
if(box.height<0)
{
box.y +=box.height;
box.height *= -1;
}
draw_box(img,box);
}
break;
}
}
#include "stdafx.h"
#include "highgui.h"
using namespace cv;
void rect_mousecallback( int event, int x, int y, int flags, void* param); //画矩形的回调函数原型
CvRect box; // 被rect_mousecallback 用来确定鼠标图画框大小的的全局变量
bool drawing_box = false; //绘图标志
void draw_box(IplImage* img, CvRect rect) //教程中没有使用rect参数,用的全局变量box
{
cvRectangle(img,
cvPoint(rect.x,rect.y),
cvPoint(rect.x + rect.width, rect.y + rect.height),
CV_RGB(0,0xff,0)); //cvScalar的宏
// cvScalar(0,0,0xff)); //red
}
int _tmain(int argc, _TCHAR* argv[])
{
//初始化
char* winname="box example"; //窗口名
char* filename="E:\\iVew\\AB\\01.jpg";
IplImage* img = cvLoadImage(filename);
box = cvRect(-1,-1,0,0);
IplImage* temp = cvCloneImage(img); //创建临时图像,初始化用cvCloneImage,此函数会分配空间,运行中用cvCopy,此函数不分配新的空间
cvNamedWindow(winname); //注册回调函数之前要先声明window
cvSetMouseCallback(winname, //***安装回调函数
rect_mousecallback,
(void*) img); // 函数原型要求最后一个参数必须是void*,所以不管传入的参数是什么指针类型,都要强制转换.
while(1)
{
cvCopy(img,temp); //cvCopy只复制值,不会分配新空间给temp,所以指针位置不变. 教程中有错误,cvCopyImage()函数未定义
//reference http://blog.youkuaiyun.com/jajen/article/details/5711678
if(drawing_box) draw_box(temp,box);
cvShowImage(winname,temp);
if(cvWaitKey(15) == 27) break;
}
cvReleaseImage(&img);
cvReleaseImage(&temp);
cvDestroyWindow(winname);
exit(0);
}
//鼠标回调函数实现
void rect_mousecallback( int event, int x, int y, int flags, void* param)
{
IplImage* img = (IplImage*) param; //将setMouseCallback传入的param参数指针转化为原来的类型
switch(event)
{
case CV_EVENT_MOUSEMOVE:
{
if(drawing_box)
{
box.width = x - box.x;
box.height = y- box.height;
}
}
break;
case CV_EVENT_LBUTTONDOWN:
{
drawing_box = true;
box = cvRect(x,y,0,0);
}
break;
case CV_EVENT_LBUTTONUP:
{
drawing_box = false;
if(box.width<0)
{
box.x += box.width;
box.width *= -1;
}
if(box.height<0)
{
box.y +=box.height;
box.height *= -1;
}
draw_box(img,box);
}
break;
}
}