鼠标马赛克图像部分区域
2015-08-28 08:59
113 查看
这是一个简单的马赛克程序,利用选定矩形区域的平均值代替该区域各点的像素值。大家有没有更好的方法马赛克呢?
[c-sharp] view
plaincopy
#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图的左眼。
[c-sharp] view
plaincopy
#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图的左眼。
相关文章推荐
- 栈 链表综合使用
- 关于it-ebooks.info无法下载的一种解决方法
- CentOS7 不能ping同其他网段的问题
- DJY-broswer 利用html做桌面应用
- POJ C++程序设计 编程题#1 编程作业—多态与虚函数
- C语言堆栈入门——堆和栈的区别
- python代码`if not x:` 和`if x is not None:`和`if not x is None:`使用
- HDU 1800 Flying to the Mars
- 浅析CSS负边距
- UIWebView全解
- 英特尔6000万美元投的是怎样一家无人机公司?
- C语言中的abs()函数和exp()函数的用法
- Win10最新bulid预览版继续改进Edge的HTML5性能
- 栈和数组
- 正则表达式三
- iOS NSNumber
- 盘点那些开设比特币课程的知名大学
- thinkphp中使用PHPEXCEL导入数据
- HDU -1879-继续畅通工程
- Appium源码分析(七)-click