程序之一,在OpenCV中利用鼠標(biāo)繪制矩形
#include <cv.h>
#include <highgui.h>
#include <stdio.h>IplImage* org = 0;
IplImage* img = 0;
IplImage* tmp = 0;
IplImage* dst = 0;
void on_mouse(int event, int x, int y, int flags, void* ustc)
{static CvPoint pre_pt = { -1, -1 };static CvPoint cur_pt = { -1, -1 }; //初始化鼠標(biāo)窗口的選擇的坐標(biāo)CvFont font;cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA); //表示書寫文字的操作char temp[16];if (event == CV_EVENT_LBUTTONDOWN) //當(dāng)鼠標(biāo)按下時,輸出當(dāng)前的坐標(biāo)位置,用圓點表示{cvCopy(org, img);sprintf(temp, "(%d,%d)", x, y);pre_pt = cvPoint(x, y);cvPutText(img, temp, pre_pt, &font, cvScalar(0, 0, 0, 255));cvCircle(img, pre_pt, 3, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);cvShowImage("img", img);cvCopy(img, tmp);}else if (event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON)) //當(dāng)鼠標(biāo)移動,并且向左邊拖拽的時候,輸出鼠標(biāo)點的位置信息{cvCopy(tmp, img);sprintf(temp, "(%d,%d)", x, y);cur_pt = cvPoint(x, y);cvPutText(img, temp, cur_pt, &font, cvScalar(0, 0, 0, 255));cvShowImage("img", img);}else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)){cvCopy(tmp, img);sprintf(temp, "(%d,%d)", x, y);cur_pt = cvPoint(x, y);cvPutText(img, temp, cur_pt, &font, cvScalar(0, 0, 0, 255));cvRectangle(img, pre_pt, cur_pt, cvScalar(0, 255, 0, 0), 1, 8, 0);cvShowImage("img", img); } //當(dāng)鼠標(biāo)移動,并且向左邊拖拽的時候,畫出拖拽的矩形else if (event == CV_EVENT_LBUTTONUP){cvCopy(tmp, img);sprintf(temp, "(%d,%d)", x, y);cur_pt = cvPoint(x, y);cvPutText(img, temp, cur_pt, &font, cvScalar(0, 0, 0, 255));cvCircle(img, cur_pt, 3, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);cvRectangle(img, pre_pt, cur_pt, cvScalar(0, 255, 0, 0), 1, 8, 0);cvShowImage("img", img); //當(dāng)鼠標(biāo)按鍵放開時,畫出鼠標(biāo)點的坐標(biāo),并且畫出鼠標(biāo)畫出的矩形cvCopy(img, tmp);int width = abs(pre_pt.x - cur_pt.x);int height = abs(pre_pt.y - cur_pt.y);if (width == 0 || height == 0){cvDestroyWindow("dst");return;} //查看鼠標(biāo)畫出的矩形的大小,并用改大小表示這一區(qū)域的圖像dst = cvCreateImage(cvSize(width, height), org->depth, org->nChannels);CvRect rect; if (pre_pt.x<cur_pt.x && pre_pt.y<cur_pt.y){rect = cvRect(pre_pt.x, pre_pt.y, width, height);}else if (pre_pt.x>cur_pt.x && pre_pt.y<cur_pt.y){rect = cvRect(cur_pt.x, pre_pt.y, width, height);}else if (pre_pt.x>cur_pt.x && pre_pt.y>cur_pt.y){rect = cvRect(cur_pt.x, cur_pt.y, width, height);}else if (pre_pt.x<cur_pt.x && pre_pt.y>cur_pt.y){rect = cvRect(pre_pt.x, cur_pt.y, width, height);}cvSetImageROI(org, rect); //取圖像感興趣區(qū)域的圖像,rect里的圖像cvCopy(org, dst); cvResetImageROI(org);cvDestroyWindow("dst");cvNamedWindow("dst", 1);cvShowImage("dst", dst);cvSaveImage("dst.jpg", dst);}
}
int main()
{org = cvLoadImage("D:6.jpg", 1);img = cvCloneImage(org);tmp = cvCloneImage(org);cvNamedWindow("img", 1);cvSetMouseCallback("img", on_mouse, 0);cvShowImage("img", img);cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&org);cvReleaseImage(&img);cvReleaseImage(&tmp);cvReleaseImage(&dst);return 0;
}
效果圖如下
?
程序之二,在OpenCV中利用鼠標(biāo)繪制矩形并截取該矩形區(qū)域的圖像
[c-sharp]?view plaincopy
#include?<cv.h>?? #include?<highgui.h>?? #include?<stdio.h>?? #pragma?comment(?lib,?"cv.lib"?)?? #pragma?comment(?lib,?"cxcore.lib"?)?? #pragma?comment(?lib,?"highgui.lib"?)?? IplImage*?org?=?0;?? IplImage*?img?=?0;??? IplImage*?tmp?=?0;??? IplImage*?dst?=?0;??? void?on_mouse(?int?event,?int?x,?int?y,?int?flags,?void*?ustc)?? {?? ????static?CvPoint?pre_pt?=?{-1,-1};?? ????static?CvPoint?cur_pt?=?{-1,-1};?? ????CvFont?font;?? ????cvInitFont(&font,?CV_FONT_HERSHEY_SIMPLEX,?0.5,?0.5,?0,?1,?CV_AA);?? ????char?temp[16];?? ?????? ????if(?event?==?CV_EVENT_LBUTTONDOWN?)?? ????{?? ????????cvCopy(org,img);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????pre_pt?=?cvPoint(x,y);?? ????????cvPutText(img,temp,?pre_pt,?&font,?cvScalar(0,0,?0,?255));?? ????????cvCircle(?img,?pre_pt,?3,cvScalar(255,0,0,0)?,CV_FILLED,?CV_AA,?0?);?? ????????cvShowImage(?"img",?img?);?? ????????cvCopy(img,tmp);?? ????}?? ????else?if(?event?==?CV_EVENT_MOUSEMOVE?&&?!(flags?&?CV_EVENT_FLAG_LBUTTON))?? ????{?? ????????cvCopy(tmp,img);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????cur_pt?=?cvPoint(x,y);???????? ????????cvPutText(img,temp,?cur_pt,?&font,?cvScalar(0,0,?0,?255));?? ????????cvShowImage(?"img",?img?);?? ????}?? ????else?if(?event?==?CV_EVENT_MOUSEMOVE?&&?(flags?&?CV_EVENT_FLAG_LBUTTON))?? ????{?? ????????cvCopy(tmp,img);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????cur_pt?=?cvPoint(x,y);???????? ????????cvPutText(img,temp,?cur_pt,?&font,?cvScalar(0,0,?0,?255));?? ????????cvRectangle(img,?pre_pt,?cur_pt,?cvScalar(0,255,0,0),?1,?8,?0?);?? ????????cvShowImage(?"img",?img?);?? ????}?? ????else?if(?event?==?CV_EVENT_LBUTTONUP?)?? ????{?? ????????cvCopy(tmp,img);?? ????????sprintf(temp,"(%d,%d)",x,y);?? ????????cur_pt?=?cvPoint(x,y);???????? ????????cvPutText(img,temp,?cur_pt,?&font,?cvScalar(0,0,?0,?255));?? ????????cvCircle(?img,?cur_pt,?3,cvScalar(255,0,0,0)?,CV_FILLED,?CV_AA,?0?);?? ????????cvRectangle(?img,?pre_pt,?cur_pt,?cvScalar(0,255,0,0),?1,?8,?0?);?? ????????cvShowImage(?"img",?img?);?? ????????cvCopy(img,tmp);?? ????????int?width=abs(pre_pt.x-cur_pt.x);?? ????????int?height=abs(pre_pt.y-cur_pt.y);?? ????????if(width==0?||?height==0)?? ????????{?? ????????????cvDestroyWindow("dst");?? ????????????return;?? ????????}?? ????????dst=cvCreateImage(cvSize(width,height),org->depth,org->nChannels);?? ????????CvRect?rect;?? ????????if(pre_pt.x<cur_pt.x?&&?pre_pt.y<cur_pt.y)?? ????????{?? ????????????rect=cvRect(pre_pt.x,pre_pt.y,width,height);?? ????????}?? ????????else?if(pre_pt.x>cur_pt.x?&&?pre_pt.y<cur_pt.y)?? ????????{?? ????????????rect=cvRect(cur_pt.x,pre_pt.y,width,height);?? ????????}?? ????????else?if(pre_pt.x>cur_pt.x?&&?pre_pt.y>cur_pt.y)?? ????????{?? ????????????rect=cvRect(cur_pt.x,cur_pt.y,width,height);?? ????????}?? ????????else?if(pre_pt.x<cur_pt.x?&&?pre_pt.y>cur_pt.y)?? ????????{?? ????????????rect=cvRect(pre_pt.x,cur_pt.y,width,height);?? ????????}?? ????????cvSetImageROI(org,rect);?? ????????cvCopy(org,dst);?? ????????cvResetImageROI(org);?? ????????cvDestroyWindow("dst");?? ????????cvNamedWindow("dst",1);?? ????????cvShowImage("dst",dst);?? ????????cvSaveImage("dst.jpg",dst);?? ????}?? }?? int?main()?? {?? ????org=cvLoadImage("lena.jpg",1);?? ????img=cvCloneImage(org);?? ????tmp=cvCloneImage(org);?? ????cvNamedWindow("img",1);?? ????cvSetMouseCallback(?"img",?on_mouse,?0?);?? ?????? ????cvShowImage("img",img);?? ????cvWaitKey(0);??? ????cvDestroyAllWindows();?? ????cvReleaseImage(&org);?? ????cvReleaseImage(&img);?? ????cvReleaseImage(&tmp);?? ????cvReleaseImage(&dst);?? ????return?0;?? }??
?
效果圖如下
?
總結(jié)
以上是生活随笔為你收集整理的鼠标绘制矩形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。