- #include "cv.h"
- #include "highgui.h"
- #include <stdio.h>
- CvPoint prev_pt={-1,-1} ;
- CvPoint pt_beg={-1,-1},pt_end = {-1,-1};
- CvPoint pt1={-1,-1},pt2={-1,-1};
- CvRect rect;
- IplImage *src;
- IplImage *tmp;
- void onMouse(int event,int x,int y,int flags,void *param);
- int main(int argc,char **argv)
- {
- IplImage *dst;
- int c;
- if ((argc !=2)||!(src=/blog.armyourlife.info/cvLoadImage(argv[1],1)))
- {
- printf("Error when Loading the Picture....Exit/n");
- return -1;
- }
- cvNamedWindow("SRC",1);
- cvShowImage("SRC",src);
- tmp = cvCloneImage(src);
- cvSetMouseCallback("SRC",onMouse,0);
- for (;;)
- {
- c = cvWaitKey(10);
- if ((char)c=='c')
- {
- if (pt_beg.x!=-1)
- {
- rect.x = min(pt_beg.x,pt_end.x);
- rect.y = min(pt_beg.y,pt_end.y);
- rect.height = abs(pt_end.y-pt_beg.y);
- rect.width = abs(pt_end.x-pt_beg.x);
- printf("RECT:height=%d,width=%d/n",rect.height,rect.width);
- cvSetImageROI(src,rect);
- printf("ROI:Height=%d,Width=%d./n",src->roi->height,src->roi->width);
- dst = cvCreateImage(cvSize(rect.width,rect.height),src->depth,src->nChannels);
- dst = cvCloneImage(src);
- printf("DST Height=%d,Width=%d/n",dst->height,dst->width);
- cvNamedWindow("Selected",1);
- cvShowImage("Selected",dst);
- cvSaveImage("selected.jpg",dst);
- printf("Finished!/n");
- cvWaitKey(0);
- cvDestroyWindow("Selected");
- cvReleaseImage(&dst);
- break;
- }
- }
- else if ((char)c==27) //ESC to exit
- {
- cvReleaseImage(&tmp);
- cvReleaseImage(&src);
- cvDestroyWindow("SRC");
- break;
- }
- }
- return 0;
- }
- void onMouse(int event,int x,int y,int flags,void *)
- {
- printf("x=%d,y=%d./n",x,y);
- printf("Begin:x=%d,y=%d./n",pt_beg.x,pt_beg,y);
- printf("END:x=%d,y=%d./n",pt_end.x,pt_end.y);
- if (!tmp)
- {
- return ;
- }
- /*判断左键是否放开,并且没有进行拖拽*/
- if (event == CV_EVENT_LBUTTONUP||!(flags & CV_EVENT_FLAG_LBUTTON))
- {//CV_EVENT_LBUTTONUP左键放开,CV_EVENT_FLAG_LBUTTON左键拖拽,
- prev_pt=cvPoint(-1,-1);
- }
- /*若左键按下则记录为起始点*/
- else if (event == CV_EVENT_LBUTTONDOWN)
- {
- prev_pt = cvPoint(x,y);
- pt_beg = cvPoint(x,y);
- }
- /*若鼠标在滑动,并且在拖拽状态*/
- else if (event == CV_EVENT_MOUSEMOVE && (flags && CV_EVENT_FLAG_LBUTTON) )
- {
- cvCopy(src,tmp);
- CvPoint pt =cvPoint(x,y);
- /*得到另外两个点,以便进行矩形拖动绘制*/
- pt1.x = pt.x;
- pt1.y = prev_pt.y;
- pt2.x = prev_pt.x;
- pt2.y = pt.y;
- cvLine( tmp, prev_pt, pt1, cvScalarAll(255), 2, 8, 0 );
- cvLine( tmp, prev_pt, pt2, cvScalarAll(255), 2, 8, 0 );
- cvLine( tmp, pt1, pt, cvScalarAll(255), 2, 8, 0 );
- cvLine( tmp, pt2, pt, cvScalarAll(255), 2, 8, 0 );
- pt_end = pt;
- cvShowImage("SRC",tmp);
- }
- }
通过运行改代码可以知道,显示出源图像后,按‘c’可以获取框取的ROI区域,并在Selected窗口进行了显示。
但是选框为白色,在选取白底黑目标物体的时候,选框可能
看不到,因此,本人对代码进行了改进,使得选框变为
红色,便于大家观察被选择的ROI区域。
下面是运行的结果图:
![](https://img-my.csdn.net/uploads/201304/16/1366113341_7945.jpg)