在OpenCV中利用鼠标马赛克图像部分区域

这是一个简单的马赛克程序,利用选定矩形区域的平均值代替该区域各点的像素值。大家有没有更好的方法马赛克呢?

#include <cv.h>   #include <highgui.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;    int foo=6;   void on_mouse( int eventint x, int y, int flags, void* ustc)   {       CvPoint p0;       CvPoint p1;       ifevent == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))       {           img=cvCloneImage(tmp);           cvResetImageROI(img);           if(x<foo)           {               if(y<foo)               {                   p0=cvPoint(0,0);                   p1=cvPoint(2*foo,2*foo);               }               else if(y>img->height-foo)               {                    p0=cvPoint(0,img->height-2*foo);                   p1=cvPoint(2*foo,img->height);               }               else               {                   p0=cvPoint(0,y-foo);                   p1=cvPoint(2*foo,y+foo);               }           }           else if(x>img->width-foo)           {               if(y<foo)               {                   p0=cvPoint(img->width-2*foo,0);                   p1=cvPoint(img->width,2*foo);               }               else if(y>img->height-foo)               {                    p0=cvPoint(img->width-2*foo,img->height-2*foo);                   p1=cvPoint(img->width,img->height);               }               else               {                   p0=cvPoint(img->width-2*foo,y-foo);                   p1=cvPoint(img->width,y+foo);               }           }           else           {               if(y<foo)               {                   p0=cvPoint(x-foo,0);                   p1=cvPoint(x+foo,2*foo);               }               else if(y>img->height-foo)               {                    p0=cvPoint(x-foo,img->height-2*foo);                   p1=cvPoint(x+foo,img->height);               }               else               {                   p0=cvPoint(x-foo,y-foo);                   p1=cvPoint(x+foo,y+foo);               }           }           cvRectangle(img,p0,p1,CV_RGB(0,255,0));           cvShowImage( "img", img );       }       else ifevent == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))       {           if(x<foo)           {               if(y<foo)               {                   p0=cvPoint(0,0);                   p1=cvPoint(2*foo,2*foo);               }               else if(y>img->height-foo)               {                    p0=cvPoint(0,img->height-2*foo);                   p1=cvPoint(2*foo,img->height);               }               else               {                   p0=cvPoint(0,y-foo);                   p1=cvPoint(2*foo,y+foo);               }           }           else if(x>img->width-foo)           {               if(y<foo)               {                   p0=cvPoint(img->width-2*foo,0);                   p1=cvPoint(img->width,2*foo);               }               else if(y>img->height-foo)               {                    p0=cvPoint(img->width-2*foo,img->height-2*foo);                   p1=cvPoint(img->width,img->height);               }               else               {                   p0=cvPoint(img->width-2*foo,y-foo);                   p1=cvPoint(img->width,y+foo);               }           }           else           {               if(y<foo)               {                   p0=cvPoint(x-foo,0);                   p1=cvPoint(x+foo,2*foo);               }               else if(y>img->height-foo)               {                    p0=cvPoint(x-foo,img->height-2*foo);                   p1=cvPoint(x+foo,img->height);               }               else               {                   p0=cvPoint(x-foo,y-foo);                   p1=cvPoint(x+foo,y+foo);               }           }           dst=cvCloneImage(tmp);             cvSetImageROI(dst,cvRect(p0.x,p0.y,p1.x-p0.x,p1.y-p0.y));           CvScalar mean=cvAvg(dst);           cvSet(dst,mean);           cvResetImageROI(dst);           tmp=cvCloneImage(dst);           cvRectangle(dst,p0,p1,CV_RGB(0,255,0));           cvShowImage( "img", dst );             }   }   int main()   {       org=cvLoadImage("lena.jpg",1);       img=cvCloneImage(org);       tmp=cvCloneImage(org);       dst=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;   }  

效果图如下,这里马赛克了lena图的左眼。

在OpenCV中利用鼠标马赛克图像部分区域

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/de21a05c250c5da0721eed67584fe647.html