这是一个简单的马赛克程序,利用选定矩形区域的平均值代替该区域各点的像素值。大家有没有更好的方法马赛克呢?
- #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 event, int x, int y, int flags, void* ustc)
- {
- CvPoint p0;
- CvPoint p1;
- if( event == 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 if( event == 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图的左眼。