opencv的初步使用(高斯模糊、边缘检测、灰度化、二值化、闭运算、绘制边缘)

前提:已经配好了opencv+Qt
这里只讲如何使用api,不怎么讲算法原理

既然要用opencv的库,首先把相应的头文件导进去吧

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<cv.h>

using namespace cv;

我这里只导入了我用到了的头文件
using namespace cv;是用来声明cv,类似于using namespace std;

1、展示出一张图片
如果已经声明了using namespace cv;前面可以不加cv::

  //【1】载入原始图
//路径下应该有一张名为5.JPG的素材
Mat image=imread("C:/Users/junyi.pc/Desktop/5.JPG",IMREAD_COLOR);
cv::namedWindow("原图", WINDOW_AUTOSIZE); // 创建一个窗
cv::imshow("原图", image);
sleep(3000);
cv::destroyWindow("原图");

Mat是opencv中存放图片的数据结构
imread是读入图片
namedWindow 声明一个窗口
imshow 将图片展示出来
sleep 我自己写的延迟的函数,下边后展示出来
destroyWindow 让展示的窗口消失

void sleep(unsigned int Msec){
    QTime reachTime=QTime::currentTime().addMSecs(Msec);
    while(QTime::currentTime()<reachTime){
      QCoreApplication::processEvents(QEventLoop::AllEvents,100);
    }
}

2、高斯模糊
作用:顾名思义,将一图片变得更模糊

       GaussianBlur(image,dst,Size(3,3),0);
        cv::namedWindow("高斯模糊图", WINDOW_AUTOSIZE); // 创建一个窗
        qImg = IplImage(dst); // cv::Mat -> IplImage
        cvSaveImage("C://Users//junyi.pc//Desktop//temp.jpg", &qImg);
        cv::imshow("高斯模糊图", dst);
        sleep(5000);
        cv::destroyWindow("高斯模糊图");

GaussianBlur 中第一个参数是读入的图片,第二行dst是输出图片,也是Mat类型,Size(3,3)是矩阵内核,必须是奇数,数值越大越模糊。

IplImage qImg = IplImage(dst); // cv::Mat -> IplImage
cvSaveImage("C://Users//junyi.pc//Desktop//temp.jpg", &qImg);
这两行代码是将处理后的图片另存为

除了高斯模糊,还有均值模糊等等

3、灰度化
作用:将图片彩色去掉

 cvtColor( src, dst, CV_RGB2GRAY );
//src, dst都是Mat 类型,前者是输入图片,后者是输出图片-即灰度图

4、索贝尔边缘检测

Mat src = imread("C:/Users/junyi.pc/Desktop/temp.jpg",IMREAD_COLOR);
           Sobel( src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT );
           convertScaleAbs( grad_x, abs_grad_x );
           Sobel( src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT );
           convertScaleAbs( grad_y, abs_grad_y );
           addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );
           qImg = IplImage(dst); // cv::Mat -> IplImage
           cvSaveImage("C://Users//junyi.pc//Desktop//temp.jpg", &qImg);
           cv::namedWindow("索贝尔算子边缘检测图");
           cv::imshow("索贝尔算子边缘检测图",dst);
           sleep(5000);
           cv::destroyWindow("索贝尔算子边缘检测图");
    第一个参数,InputArray 类型的src,为输入图像,填Mat类型即可。
    第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
    第三个参数,int类型的ddepth,输出图像的深度,支持如下src.depth()和ddepth的组合:

        若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F
        若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F
        若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F
        若src.depth() = CV_64F, 取ddepth = -1/CV_64F

    第四个参数,int类型dx,x 方向上的差分阶数。
    第五个参数,int类型dy,y方向上的差分阶数。
    第六个参数,int类型ksize,有默认值3,表示Sobel核的大小;必须取1,3,5或7。
    第七个参数,double类型的scale,计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。我们可以在文档中查阅getDerivKernels的相关介绍,来得到这个参数的更多信息。
    第八个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
    第九个参数, int类型的borderType,我们的老朋友了(万年是最后一个参数),边界模式,默认值为BORDER_DEFAULT。这个参数可以在官方文档中borderInterpolate处得到更详细的信息。

5、二值化

src=imread("C:/Users/junyi.pc/Desktop/temp.jpg",IMREAD_COLOR);
           dst.create( src.size(), src.type() );
           // 【2】将原图像转换为灰度图像
           cvtColor( src, gray, CV_BGR2GRAY );
           // 【3】先用使用 3x3内核来降噪
           blur( gray, edge, Size(3,3) );
           //type选THRESH_BINARY,大于阈值的设置为maxval(255),其它置0
           threshold(edge, dst, nY20_thresh, 255, THRESH_BINARY);
           qImg = IplImage(dst); // cv::Mat -> IplImage
           cvSaveImage("C://Users//junyi.pc//Desktop//temp.jpg", &qImg);
           cv::namedWindow("二值化图", WINDOW_AUTOSIZE); // 创建一个窗
           cv::imshow("二值化图", dst);
           sleep(5000);
           cv::destroyWindow("二值化图");

关键在于threshold(edge, dst, nY20_thresh, 255, THRESH_BINARY);
nY20_thresh是阈值,设定阈值的方式有很多种可自行百度,255是最大值,一般就是255

6、闭运算

image=imread("C:/Users/junyi.pc/Desktop/temp.jpg",IMREAD_COLOR);
          dst =getStructuringElement(MORPH_RECT,Size(4,4));
          morphologyEx(image,image, MORPH_CLOSE, dst);
          qImg = IplImage(image); // cv::Mat -> IplImage
          cvSaveImage("C://Users//junyi.pc//Desktop//temp.jpg", &qImg);
          cv::namedWindow("闭运算图", WINDOW_AUTOSIZE); // 创建一个窗
          cv::imshow("闭运算图", image);
          sleep(5000);
          cv::destroyWindow("闭运算图");
          break;

dst =getStructuringElement(MORPH_RECT,Size(4,4));
获取一个内核矩阵
morphologyEx(image,image, MORPH_CLOSE, dst);
使用dst这个内核矩阵来执行闭运算,输入输出都是image

7、绘制边缘

   void func10(Mat im){
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    if(!im.data)
    {cout<<"Can't find image!";}
    //change the image to binary by setting a threshold
    threshold(im,im,120,255,THRESH_BINARY);
    findContours(im,contours,hierarchy,CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
    Mat contoursImage(im.rows,im.cols,CV_8U,Scalar(255));
       for(int i=0;i<contours.size();i++){
            if(hierarchy[i][3]!=-1){
             drawContours(contoursImage,contours,i,Scalar(0),3);
             namedWindow("ha");
             imshow("ha",contoursImage);
             sleep(100);
            }
      }
}

findContours 是寻找边缘的函数
drawContours 将边缘绘制出来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容