opencv对图像进行背景模糊化操作(圆形)

来源:互联网 发布:java继承实现接口用 编辑:程序博客网 时间:2024/06/06 11:49

其实对这个任务重要的是对鼠标事件的理解。。。
分类为

Event:#define CV_EVENT_MOUSEMOVE 0                   滑动#define CV_EVENT_LBUTTONDOWN 1           左键点击#define CV_EVENT_RBUTTONDOWN 2           右键点击#define CV_EVENT_MBUTTONDOWN 3           中键点击#define CV_EVENT_LBUTTONUP 4                 左键放开#define CV_EVENT_RBUTTONUP 5                 右键放开#define CV_EVENT_MBUTTONUP 6                 中键放开#define CV_EVENT_LBUTTONDBLCLK 7         左键双击#define CV_EVENT_RBUTTONDBLCLK 8         右键双击#define CV_EVENT_MBUTTONDBLCLK 9         中键双击flags:#define CV_EVENT_FLAG_LBUTTON 1           左键拖曳#define CV_EVENT_FLAG_RBUTTON 2           右键拖曳#define CV_EVENT_FLAG_MBUTTON 4           中键拖曳#define CV_EVENT_FLAG_CTRLKEY 8     (8~15)按Ctrl不放事件#define CV_EVENT_FLAG_SHIFTKEY 16   (16~31)按Shift不放事件#define CV_EVENT_FLAG_ALTKEY 32       (32~39)按Alt不放事件

大概就是用
if(event ==CV_EVENT_MOUSEMOVE )

else if((flags & (event == CV_EVENT_FLAG_LBUTTON))&&(event == CV_EVENT_MOUSEMOVE))
这样的格式吧、、、

还有对调回函数的理解

setMouseCallback(“鼠标操作”,on_MouseHandle,0);

最后上完整的代码

#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<stdio.h>#include<iostream>#include<opencv2/core/core.hpp>/**************主要思想是建立一个与原图同等size的全黑图,然后利用鼠标事件在黑图里面画白底填充圆,利用颜色差距进行条件判断,判断出应该被保留的元素位置。访问模糊过后的图的像素点,符合在圆内的像素位置则填充原图的像素,就能成功实现所选区域以外为模糊**************************/using namespace std;using namespace cv;Mat org,img,dst,tmp ,out,out_ROI;int g_radius;Point g_pre_point,g_cur_point,g_cir_point;void on_MouseHandle(int event,int x,int y,int flags,void *param)             //鼠标调回函数{    tmp=Mat::zeros(org.size(),CV_8UC1);    if(event == CV_EVENT_LBUTTONDOWN)    {        g_pre_point=Point(x,y);                                                      //事件:鼠标按下,得到此时的坐标    }    else if((flags & (event == CV_EVENT_FLAG_LBUTTON))&&(event == CV_EVENT_MOUSEMOVE))    {           g_cur_point = Point(x,y);                                    //鼠标拖拽事件,得到目前的坐标,利用这两个点得到矩形    }    else if(event == CV_EVENT_LBUTTONUP)     {        double time0 = static_cast<double>(getTickCount());        g_cur_point= Point(x,y);                     //鼠标松开按键事件        g_cir_point.x = abs( (g_pre_point.x + g_cur_point.x)/2);        g_cir_point.y = abs( (g_pre_point.y + g_cur_point.y)/2);        g_radius = (int)pow( (g_cir_point.x-g_pre_point.x)*(g_cir_point.x-g_pre_point.x)            +(g_cir_point.y-g_pre_point.y)*(g_cir_point.y-g_pre_point.y),0.5);        circle(tmp,g_cir_point,g_radius,Scalar(255,255,255),-1,8,0);        int i,j;        blur(org,out,Size(10,10));            //模糊函数        int rowNumber = org.rows;        int colNumber = org.cols;        for(i=0;i<rowNumber;i++)        {                       for(j=0;j<colNumber;j++)            {                if(tmp.at<uchar>(i,j)>0)                {                    out.at<Vec3b>(i,j)[0]=org.at<Vec3b>(i,j)[0];                    out.at<Vec3b>(i,j)[1]=org.at<Vec3b>(i,j)[1];                    out.at<Vec3b>(i,j)[2]=org.at<Vec3b>(i,j)[2];                }            }        }       namedWindow("处理结果");       imshow("处理结果",out);       cout<<"此方法运行时间为:  "<<time0<<"秒"<<endl;    }}int main(){    org = imread("1.jpg");    double time0 = static_cast<double>(getTickCount());    namedWindow("鼠标操作");    while(1)    {        setMouseCallback("鼠标操作",on_MouseHandle,0);        imshow("鼠标操作",org);        if(waitKey( 10 ) == 27) break;    }    time0=( (double)getTickCount()-time0 ) / getTickFrequency();    cout<<"此方法运行时间为:  "<<time0<<"秒"<<endl;    return(0);}
原创粉丝点击