opencv鼠标绘制矩形和截取图像的矩形区域

在opencv中利用鼠标绘制矩形,代码如下:

#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* src = 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(dst,src);  
        sprintf(temp,"(%d,%d)",x,y);  
        pre_pt = cvPoint(x,y);  
        cvPutText(src,temp, pre_pt, &font, cvScalar(0,0, 0, 255));  
        cvCircle( src, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
        cvShowImage( "src", src );  
        cvCopy(src,dst);  
    }  
    else if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))  
    {  
        cvCopy(dst,src);  
        sprintf(temp,"(%d,%d)",x,y);  
        cur_pt = cvPoint(x,y);        
        cvPutText(src,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
        cvShowImage( "src", src );  
    }  
    else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))  
    {  
        cvCopy(dst,src);  
        sprintf(temp,"(%d,%d)",x,y);  
        cur_pt = cvPoint(x,y);        
        cvPutText(src,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
        cvRectangle(src, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, 8, 0 );  
        cvShowImage( "src", src );  
    }  
    else if( event == CV_EVENT_LBUTTONUP )  
    {  
        sprintf(temp,"(%d,%d)",x,y);  
        cur_pt = cvPoint(x,y);        
        cvPutText(src,temp, cur_pt, &font, cvScalar(0,0, 0, 255));  
        cvCircle( src, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
        cvRectangle( src, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, 8, 0 );  
        cvShowImage( "src", src );  
        cvCopy(src,dst);  
    }  
}  
int main()  
{  
    src=cvLoadImage("lena.jpg",1);  
    dst=cvCloneImage(src);  
    cvNamedWindow("src",1);  
    cvSetMouseCallback( "src", on_mouse, 0 );  

    cvShowImage("src",src);  
    cvWaitKey(0);   
    cvDestroyAllWindows();  
    cvReleaseImage(&src);  
    cvReleaseImage(&dst);  
    return 0;  

效果图如下

opencv鼠标绘制矩形和截取图像的矩形区域_第1张图片

在opencv中利用鼠标绘制矩形并截取该矩形区域的图像
测试代码如下:

#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;  
}  

效果图如下:

你可能感兴趣的:(鼠标,opencv)