转换后图像,中值滤波

Opencv 笔记

转自:http://blog.csdn.net/poem\_qianmo/article/details/20537737

  CMake是3个比make更加尖端的编写翻译配置工具,它能够依据差异平台、分化的编写翻译器,生成对应的Makefile或许vcproj项目。通过编写制定CMakeLists.txt,能够操纵转变的Makefile,从而控制编写翻译进度。CMake自动生成的Makefile不仅能够透过make命令创设项目转移指标文件,还协助安装(make
install)、测试安装的程序是或不是能科学履行(make
test,也许ctest)、生成当前平台的安装包(make
package)、生王炯码包(make
package_source)、发生Dashboard展现数据并上传等高档成效,只要在CMakeLists.txt中不难陈设,就能够形成很多犬牙相制的效应,包涵写测试用例。

途径难点:

途径输入:Opencv载Qt中无法冒出汉字,路径也不可能冒出汉字在vs中能够出现。

(”D:/QTopencv/.1jpg”)=(”D:\\QTopencv\\.1jpg”)

1:Mat imread(const string& filename, intflags=1 ); 

  若是有嵌套目录,子目录下能够有友好的CMakeLists.txt。

形态学函数操作;

Mat element = getStructuringElement( erosion_type, Size(
2*erosion_size + 1, 2*erosion_size+1 ), Point( erosion_size,
erosion_size ) );

Erode( I,I1,element)

I:原始图像,I一腐蚀后图像;

Erosion_type(腐蚀类型,MOEscortPH—形态学)

矩形:MORPH_RECT

交叉形:MORPH_CROSS

椭圆:MORPH_ELLIPSE

  eg: 

  同理可得,CMake是一个丰硕强大的编写翻译自动配置工具,帮助各类平台,KDE也是用它编写翻译的

空中颜色转换:

cvtclolor(原始图像,转换后图像,转换类型);

  1. Mat image0=imread(“dota.jpg”,CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLO劲客);//载入最实际的图像  
  2. ge一=imread(“dota.jpg”,0);//载入灰度图  
  3. Mat image二=imread(“dota.jpg”,19玖);//载入三通道的彩色图像  
  4. Mat logo=imread(“dota_logo.jpg”);//载入三通道的彩色图像  

  例如,cmake能够依照CMakeLists.txt这几个布局文件,通过差异的编写翻译器采用,来扭转差别的化解方案,VisualStudio的编写翻译器对应的就生成Visual
Studio版的sln化解方案。

blurl滤波

 blur(InputArray src,OutputArray
dst,Size ksize,Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT )
src:输入图像

dst:输出图像

ksize: 模糊核的高低

************************************************************************************************************************************

1.线性滤波:

常用函数;

Mat srcImage =
imread(“C:/Users/Administrator/Desktop/车牌识别/车牌图像库/一.jpg”);//读入图像函数

 

imshow(“原图”,srcImage);//呈现图像函数

 

imwrite(“图三.jpg”,image路虎极光IO);//保存图像函数

 

Mat image中华VIO = srcImage(Rect(50,50,100,000));//感兴趣区域函数

 

cvtColor(srcImage,dstImage,CV_BGLAND二GRAY);//图像灰度化

 

 

//边缘检查评定 Sobel Laplacian Canny
个中Canny算子只好处理(八个人)灰度图,其他三种伍个人三1四个人都得以

Mat grad_x,grad_y;

Sobel(imgGray,grad_x,CV_捌U,壹,0,三,一,一);//X方向上的Sobel算子检查实验,个中三,壹,0都是暗中认可值

 

Sobel(imgGray,grad_y,CV_八U,0,一,3,一,0);//Y方向上的Sobel算子检验,在那之中3,1,0都以暗许值

 

addWeighted(grad_x,0.5,grad_y,0.伍,0,dstImage);//合并梯度

 

Laplacian(imgGray,dstImage,CV_8U);

 

Canny(img格雷,dstImage,50,200,叁);//50和200代表第1个滞后性阈值和第二个滞后性阈值,较小者用于边缘连接,较大者决定强边缘的初始段,达阈值opnecv推荐为小阈值的三倍;

//叁代表应用的Sobel算子的孔径大小 有暗许值为3;

 

// 寻找概略 只处理伍人 即灰度图像

vector<vector<Point>> contours;

findContours(imgGray,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

drawContours(dstImage,contours,-1,Scalar(0),3);

imshow(“轮廓图”,dstImage);

 

 

//阈值化操作

threshold(srcImage,dstImage,100,255,3);

imshow(“固定阈值化图像”,dstImage);

adaptiveThreshold(imgGray,dstImage,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,3,1);

imshow(“自适应阈值化图像”,dstImage);

 

 

// resize函数完毕

resize(srcImage,dstImage,Size(),0.伍,0.5);//缩短为五成

resize(srcImage,dstImage,Size(),2,2);//放大2倍

resize(srcImage,dstImage,Size(srcImage.cols*3,srcImage.rows*3));//放大3倍

 

 

// 金字塔函数达成

pyrUp(srcImage,dstImage,Size(srcImage.cols*2,srcImage.rows*2));//
放大2倍

pyrDown(srcImage,dstImage,Size(srcImage.cols/2,srcImage.rows/2));//
缩小2倍

 

//漫水填充算法

Rect ccomp;

floodFill(srcImage,Point(50,300),Scalar(155,255,55),&ccomp,Scalar(20,20,20),Scalar(20,20,20));

 

//膨胀腐蚀

Mat element = getStructuringElement(MORPH_RECT,Size(15,15));

erode(srcImage,dstImage,element);//腐蚀函数

dilate(srcImage,dstImage,element);//膨胀函数

 

morphologyEx(g_bgrImage,g_bgrImage, MORPH_CLOSE, element);//闭运算

 

morphologyEx(g_bgrImage,g_bgrImage, MORPH_OPEN, element);//开运算

 

 

//滤波

boxFilter(srcImage,dstImage,-1,Size(3,3));

imshow(“方框滤波图”,dstImage);

 

blur(srcImage,dstImage,Size(3,3));

imshow(“均值滤波图”,dstImage);

 

GaussianBlur(srcImage,dstImage,Size(5,7),1,1);

imshow(“高斯滤波图”,dstImage);

 

medianBlur(image,out,柒);//中值滤波,7为孔径的线性尺寸

bilateralFilter(src,dst,d,sigmaColor,sigmaSpace);//双边滤波,d表示过滤进度中各样像素邻域的直径,sigmaColor颜色空间滤波器的sigma值,sigmaSpace表示坐标空间中滤波器的sigma值

bilateralFilter(image,out,25,25*2,25/2);

2:int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0,void* user                      
data=0);

  这里的线性滤波首要有:方框滤波,均值滤波,高斯滤波。

背景难题

水彩属性由七个十陆进制数字钦赐 — 第柒个为背景,第二个则为前景。每一种数字能够为以下任何值之1:
    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 桔铅色     B = 淡砖影青
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色
system(“color 0二”);比如那几个正是黑底绿字

    注释:

4方滤波:

创设矩阵

Mat scrImmage, dstImage;//原始图像,

1、dstImage. create(srcImage .rows,  srcImage .cols, srcImage. type());

2、dstImage = Mat::zeros(srcImage.size(), srcImage.type());

3、dstImage=srcImage.clone();

效益的深浅,类型与原图像相同;

  • 率先个参数,const
    string&类型的trackbarname,表示轨迹条的名字,用来代表我们创造的轨迹条。
  • 第三个参数,const
    string&类型的winname,填窗口的名字,表示这一个轨迹条会依附到哪个窗口上,即对应namedWindow()成立窗口时填的某四个窗口名。
  • 其三个参数,int*
    类型的value,一个针对整型的指针,表示滑块的任务。并且在开创时,滑块的上马位置正是该变量当前的值。
  • 第多个参数,int类型的count,表示滑块可以达成的最大任务的值。PS:滑块最小的岗位的值始终为0。
  • 第5个参数,TrackbarCallback类型的onChange,首先注意她有暗中认可值0。那是多个对准回调函数的指针,每一次滑块地点变动时,那一个函数都会进展回调。并且那一个函数的原型必须为void
    XXXX(int,void*);在那之中第叁个参数是轨道条的职责,第3个参数是用户数量(看上面包车型客车第陆个参数)。若是回调是NULL指针,表示不曾回调函数的调用,仅第多少个参数value有变化。
  • 第五个参数,void*类型的userdata,他也有暗中认可值0。那些参数是用户传给回调函数的数码,用来拍卖轨迹条事件。假诺运用的第九个参数value实参是全局变量的话,完全能够不去管这几个userdata参数。
  • ******************************************************************************************************************************

void  
boxFilter(InputArray src,     OutputArray dst,     int ddepth,     Size ksize,    
Point anchor=Point(-1,-1),    bool  normalize=true, 

始建滑动条

creatTrackbar(const string& trackbarname,
const string &winname, int *value ,int count,TrackbarCallback
onChange=0,void* userdata=0)

一、第三个参数轨迹条名字,

二、第1个参数窗口名字

三、int性的指针,三个对准整型的指针,表示滑块地方。在开马上滑块的起初地方正是该变量的值。

肆、第多个参数int*品种的count,表示滑块能够达到的最大职责,滑块最小地点平昔为0;

 

  1. openCV中size类型剖析

  2. Size(5, 5);//构造出的Size宽度和冲天都为伍,即XXX.width和XXX.height都为伍  

  3. 滤波

int borderType=BORDER_DEFAULT );
 

   壹:方波滤波

  • 率先个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是单身处理的,且能够拍卖任意通道数的图形,但须求留意,待处理的图样深度应该为CV_8U,
    CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 第2个参数,OutputArray类型的dst,即指标图像,需求和源图片有雷同的尺码和体系。
  • 其多个参数,int类型的ddepth,输出图像的吃水,-一意味行使原图深度,即src.depth()。
  • 第玖个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般那样写Size(
    w,h )来表示内核的轻重缓急( 当中,w 为像素宽度,
    h为像素中度)。Size(三,叁)就表示三x三的核大小,Size(5,伍)就象征5×5的核大小
  • 第四个参数,Point类型的anchor,表示锚点(即被平整的丰裕点),注意她有暗许值Point(-1,-壹)。要是那一个点坐标是负值的话,就象征取核的骨干为锚点,所以私下认可值Point(-一,-一)表示这些锚点在核的基本。
  • 第伍个参数,bool类型的normalize,暗中认可值为true,四个标识符,表示内核是不是被其区域归1化(normalized)了。
  • 第多个参数,int类型的borderType,用于预计图像外部像素的某种边界形式。有暗中认可值BOCR-VDE陆风X捌_DEFAULT,大家1般不去管它。

    void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true,


                   int borderTy  
pe=BORDER_DEFAULT ) 

均值滤波:

    

void blur(InputArray src,  
OutputArraydst,   Size ksize,   Point anchor=Point(-1,-1),   int borderType=BORDER_DEFAULT ) ; 

       参数详解:

  • 率先个参数,InputArray类型的src,输入图像,即源图像,填Mat类的靶子即可。该函数对通道是单身处理的,且能够拍卖任意通道数的图形,但须要留意,待处理的图样深度应该为CV_8U,
    CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 其次个参数,OutputArray类型的dst,即目的图像,须求和源图片有平等的尺寸和品种。比如可以用Mat::Clone,以源图片为模板,来开端化获得如假包换的对象图。
  • 其多个参数,Size类型(对Size类型稍后有教学)的ksize,内核的大大小小。一般那样写Size(
    w,h )来表示内核的分寸( 其中,w 为像素宽度,
    h为像素中度)。Size(三,三)就代表三x叁的核大小,Size(5,伍)就意味着5×5的核大小
  • 第多个参数,Point类型的anchor,表示锚点(即被平整的万分点),注意她有暗中认可值Point(-1,-一)。借使那么些点坐标是负值的话,就意味着取核的主导为锚点,所以私下认可值Point(-壹,-一)表示这些锚点在核的主干。
  • 第伍个参数,int类型的borderType,用于推断图像外部像素的某种边界格局。有默许值BOHighlanderDECR-V_DEFAULT,我们一般不去管它。
  • 首先个参数,InputArray类型的src,输入图像,即源图像,填Mat类的靶子即可。该函数对通道是独立处理的,且能够拍卖任意通道数的图纸,但需求专注,待处理的图形深度应该为CV_8U,
    CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 其次个参数,OutputArray类型的dst,即指标图像,须要和源图片有相同的尺码和项目。
  • 其多少个参数,int类型的ddepth,输出图像的深度,-1意味着行使原图深度,即src.depth()。
  • 第6个参数,Size类型(对Size类型稍后有教书)的ksize,内核的深浅。壹般那样写Size(
    w,h )来代表内核的轻重( 其中,w 为像素宽度,
    h为像素高度)。Size(3,3)就象征三x叁的核大小,Size(五,5)就代表5×5的核大小
  • 第4个参数,Point类型的anchor,表示锚点(即被平整的十一分点),注意她有默许值Point(-1,-一)。假使那些点坐标是负值的话,就意味着取核的为主为锚点,所以暗中同意值Point(-一,-1)表示那个锚点在核的主导。
  • 第4个参数,bool类型的normalize,默许值为true,3个标识符,表示内核是或不是被其区域归一化(normalized)了。
  • 第四个参数,int类型的borderType,用于预计图像外部像素的某种边界格局。有私下认可值BO奇骏DE凯雷德_DEFAULT,大家壹般不去管它

   二:均值滤波

高斯滤波:

      void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )  

void GaussianBlur(InputArray src,  
OutputArray  dst,    Size ksize,    double sigmaX,    double sigmaY=0,  
intborderType=BORDER_DEFAULT )  

      

  • 第3个参数,InputArray类型的src,输入图像,即源图像,填Mat类的指标即可。它能够是独自的4意通道数的图样,但要求留意,图片深度应该为CV_8U,CV_16U,
    CV_16S, CV_32F 以及 CV_64F之一。
  • 其次个参数,OutputArray类型的dst,即目的图像,要求和源图片有同1的尺寸和花色。比如能够用Mat::Clone,以源图片为模板,来初叶化获得如假包换的靶子图。
  • 其多少个参数,Size类型的ksize高斯基础的尺寸。当中ksize.width和ksize.height能够差异,但他俩都必须为正数和奇数。也许,它们得以是零的,它们都以由sigma总括而来。
  • 第多少个参数,double类型的sigmaX,表示高斯核函数在X方向的的业内不是。
  • 第5个参数,double类型的sigmaY,表示高斯核函数在Y方向的的规范不是。若sigmaY为零,就将它设为sigmaX,假若sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height总计出来。
  • 为了结果的正确着想,最棒是把第多少个参数Size,第三个参数sigmaX和第5个参数sigmaY全体点名到。
  • 第伍个参数,int类型的borderType,用于推测图像外部像素的某种边界方式。有暗许值BO猎豹CS陆DECRUISER_DEFAULT,大家1般不去管它。
  • 先是个参数,InputArray类型的src,输入图像,即源图像,填Mat类的目的即可。该函数对通道是独自处理的,且能够处理任意通道数的图片,但要求小心,待处理的图纸深度应该为CV_8U,
    CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 其次个参数,OutputArray类型的dst,即指标图像,必要和源图片有相同的尺码和连串。比如能够用Mat::Clone,以源图片为模板,来开始化得到如假包换的靶子图。
  • 其多少个参数,Size类型(对Size类型稍后有教学)的ksize,内核的分寸。1般那样写Size(
    w,h )来代表内核的深浅( 当中,w 为像素宽度,
    h为像素中度)。Size(3,三)就意味着3x三的核大小,Size(伍,5)就表示5×5的核大小
  • 第多个参数,Point类型的anchor,表示锚点(即被平整的不得了点),注意她有私下认可值Point(-1,-一)。即便那个点坐标是负值的话,就象征取核的宗旨为锚点,所以暗中认可值Point(-一,-壹)表示这一个锚点在核的骨干。
  • 第四个参数,int类型的borderType,用于揣测图像外部像素的某种边界格局。有暗中认可值BO中华VDE猎豹CS陆_DEFAULT,我们一般不去管它

2.非线性滤波:

    3: 高斯滤波

非线性滤波主要有:中值滤波,双边滤波。

          void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
 

中值滤波:

      

 void medianBlur(InputArray src,   OutputArray dst,  
  int ksize);  

  • 先是个参数,InputArray类型的src,输入图像,即源图像,填Mat类的靶子即可。它能够是单独的即兴通道数的图片,但必要小心,图片深度应该为CV_8U,CV_16U,
    CV_16S, CV_32F 以及 CV_64F之一。
  • 其次个参数,OutputArray类型的dst,即指标图像,需求和源图片有相同的尺码和类别。比如能够用Mat::Clone,以源图片为模板,来开首化获得如假包换的靶子图。
  • 其五个参数,Size类型的ksize高斯基本的大大小小。个中ksize.width和ksize.height能够差异,但他们都必须为正数和奇数。大概,它们得以是零的,它们都以由sigma总计而来。
  • 第三个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准不是。
  • 第陆个参数,double类型的sigmaY,表示高斯核函数在Y方向的的正规化不是。若sigmaY为零,就将它设为sigmaX,假设sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
  • 为了结果的不利着想,最棒是把第多少个参数Size,第多少个参数sigmaX和第六个参数sigmaY全体点名到。
  • 第6个参数,int类型的borderType,用于臆想图像外部像素的某种边界形式。有暗中认可值BOHummerH二DE汉兰达_DEFAULT,大家一般不去管它。
  • 先是个参数,InputArray类型的src,函数的输入参数,填壹、三依旧肆通道的Mat类型的图像;当ksize为叁要么5的时候,图像深度需为CV_8U,CV_16U,或CV_32F当中之1,而对此较大孔径尺寸的图片,它只可以是CV_8U。
  • 第3个参数,OutputArray类型的dst,即目的图像,函数的出口参数,要求和源图片有相同的尺码和系列。大家得以用Mat::Clone,以源图片为模板,来开首化获得如假包换的靶子图。
  • 其四个参数,int类型的ksize,孔径的线性尺寸(aperture linear
    size),注意那个参数必须是高于一的奇数,比如:三,5,7,九 …

    4:中值滤波


        void medianBlur(InputArray src,OutputArray dst, int ksize) 

互相滤波:

 
  且对于多通道图片,每1个通路都单身举办拍卖,并且匡助就地操作(In-placeoperation)。

void bilateralFilter(InputArray src,
  OutputArraydst,   int d,   double sigmaColor,   double sigmaSpace,   int borderType=BORDER_DEFAULT);
 

       

  • 先是个参数,InputArray类型的src,输入图像,即源图像,需求为陆个人还是浮点型单通道、三通道的图像。
  • 第三个参数,OutputArray类型的dst,即目的图像,须要和源图片有雷同的尺码和品种。
  • 其四个参数,int类型的d,表示在过滤进程中各样像素邻域的直径。假使这些值我们设其为非正数,那么OpenCV会从第5个参数sigmaSpace来测算出它来。
  • 第三个参数,double类型的sigmaColor,颜色空间滤波器的sigma值。这么些参数的值越大,就注脚该像素邻域内有更广大的颜料会被混合到共同,发生较大的半非常颜色区域。
  • 第肆个参数,double类型的sigmaSpace坐标空间中滤波器的sigma值,坐标空间的标号方差。他的数值越大,意味着越远的像素会相互影响,从而使更加大的区域充分相似的颜色获取相同的颜色。当d>0,d内定了邻域大小且与sigmaSpace非亲非故。否则,d正比于sigmaSpace。
  • 第五个参数,int类型的borderType,用于估算图像外部像素的某种边界方式。注意它有私下认可值BO中华VDEPRADO_DEFAULT。

       参数详解:

 

  • 率先个参数,InputArray类型的src,函数的输入参数,填1、叁要么四通道的Mat类型的图像;当ksize为3大概伍的时候,图像深度需为CV_8U,CV_16U,或CV_3贰F在那之中之壹,而对此较大孔径尺寸的图纸,它不得不是CV_8U。
  • 其次个参数,OutputArray类型的dst,即指标图像,函数的输出参数,须要和源图片有雷同的尺寸和类型。大家能够用Mat::Clone,以源图片为模板,来初阶化获得如假包换的对象图。
  • 其三个参数,int类型的ksize,孔径的线性尺寸(aperture linear
    size),注意这些参数必须是过量1的奇数,比如:三,5,七,玖 …

三.数学形态学的中央概念:

     五:双边滤波

数学形态学(Mathematical morphology)
是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的宗旨思论。其中央的演算包罗:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。

                     void bilateralFilter(InputArray src, OutputArraydst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

 

  • 率先个参数,InputArray类型的src,输入图像,即源图像,须求为6位依然浮点型单通道、三通路的图像。
  • 其次个参数,OutputArray类型的dst,即指标图像,须求和源图片有同一的尺寸和种类。
  • 其八个参数,int类型的d,表示在过滤进度中各样像素邻域的直径。即使那个值大家设其为非正数,那么OpenCV会从第四个参数sigmaSpace来总结出它来。
  • 第多少个参数,double类型的sigmaColor,颜色空间滤波器的sigma值。那些参数的值越大,就申明该像素邻域内有更广泛的颜料会被混合到一同,发生较大的半对等颜色区域。
  • 第6个参数,double类型的sigmaSpace坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会互相影响,从而使更加大的区域丰盛相似的颜色获取相同的水彩。当d>0,d钦命了邻域大小且与sigmaSpace毫不相关。不然,d正比于sigmaSpace。
  • 第肆个参数,int类型的borderType,用于估算图像外部像素的某种边界方式。注意它有私下认可值BOENVISIONDE奥迪Q3_DEFAULT。

4.膨胀:

**************************************************************************************************************************************************************************************** 

 void dilate(InputArray src,   OutputArray dst,
 InputArray kernel,   Point anchor=Point(-1,-1),      int iterations=1,  int borderType=BORDER_CONSTANT,    const Scalar& borderValue=morphologyDefaultBorderValue()
  );  

   陆:腐蚀与膨胀

  • 先是个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的多少得以是即兴的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或
    CV_64F其中之壹。
  • 第2个参数,OutputArray类型的dst,即目的图像,供给和源图片有平等的尺寸和品种。
  • 其三个参数,InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是应用参考点位于大旨三x三的核。
  • 咱俩1般采取函数
    getStructuringElement合营这一个参数的使用。getStructuringElement函数会回来钦命形状和尺寸的构造成分

    int g_nStructElementSize = 三; //结构成分(内核矩阵)的尺寸

    //获取自定义核
    Mat element = getStructuringElement(MORPH_RECT,

    Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),  
    Point( g_nStructElementSize, g_nStructElementSize ));  
    

      而作者辈图像处理中指的形态学,往往代表的是数学形态学。

里头,getStructuringElement函数的第几个参数表示内核的造型,大家能够挑选如下三种形态之一:

   
  其主导的演算包罗:2值腐蚀和膨胀、2值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值
      开闭运算、灰值形态学梯度等。

  • 矩形: MORPH_RECT
  • 交叉形: MORPH_CROSS
  • 椭圆形:MORPH_ELLIPSE

   
  形态学操作正是基于形状的一密密麻麻图像处理操作。OpenCV为拓展图像的形态学变换提供了高速、方便的函数。最大旨的形态学操作有三种,他们是:膨胀与腐蚀(Dilation
      与Erosion)。

而getStructuringElement函数的第一和第陆个参数分别是内核的尺码以及锚点的岗位。对于锚点的岗位,有默许值Point(-一,-一),表示锚点位于中央。且须要注意,交叉形的element形状唯1重视于锚点的地方。而在别的意况下,锚点只是潜移默化了形态学生运动算结果的舞狮。

     
在进展腐蚀和膨胀的授课从前,首先供给小心,腐蚀和膨胀是对反革命部分(高亮部分)而言的,不是中灰部分。膨胀正是图像中的高亮部分举办膨胀,“领域增加”,效果
     
图拥有比原图更加大的高亮区域。腐蚀正是原图中的高亮部分被腐蚀,“领域被私吞”,效果图拥有比原图更加小的高亮区域。

运用实例:

      膨胀与腐蚀能落到实处三种多样的机能,首要如下:

        //载入原图   
        Mat image = imread("1.jpg");  
//获取自定义核  
        Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
        Mat out;  
        //进行膨胀操作  
        dilate(image, out, element);  
  • 解除噪声
  • 细分(isolate)出单身的图像成分,在图像中连连(join)相邻的要素。
  • 搜索图像中的分明的高大值区域或十分的小值区域
  • 求出图像的梯度

5.腐蚀:

      其实,膨胀就是求局部最大值的操作。

void erode(InputArray src,  
 OutputArray dst,    InputArray kernel,     Point anchor=Point(-1,-1),
    int iterations=1,      int borderType=BORDER_CONSTANT,      const Scalar& borderValue=morphologyDefaultBorderValue()
  );  

      腐蚀是求最小值得操作。

应用办法和膨胀一样,同样必要十分getStructuringElement来行使。

      1:形态学膨胀

 6.轨迹条:

  1. C++: void dilate(  
  2.     InputArray src,  
  3.     OutputArray dst,  
  4.     InputArray kernel,  
  5.     Point anchor=Point(-1,-1),  
  6.     int iterations=1,  
  7.     int borderType=BORDER_CONSTANT,  
  8.     const Scalar& borderValue=morphologyDefaultBorderValue()   
  9. ); 

int createTrackbar(conststring&  trackbarname,  
conststring& winname,    int* value,  
 int count,    TrackbarCallback onChange=0,
  void* userdata=0); 

 

  • 先是个参数,const
    string&类型的trackbarname,表示轨迹条的名字,用来表示大家创制的轨迹条。
  • 第2个参数,const
    string&类型的winname,填窗口的名字,表示那个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某三个窗口名。
  • 其多少个参数,int*
    类型的value,二个针对整型的指针,表示滑块的岗位。并且在开即刻,滑块的起来地点正是该变量当前的值。
  • 第5个参数,int类型的count,表示滑块能够直达的最大职分的值。PS:滑块最小的职位的值始终为0。
  • 第四个参数,TrackbarCallback类型的onChange,首先注意她有暗中认可值0。那是贰个针对回调函数的指针,每一回滑块地点变动时,那个函数都会议及展览开回调。并且那个函数的原型必须为void
    XXXX(int,void*);个中第一个参数是轨道条的地方,第2个参数是用户数量(看上面包车型大巴第伍个参数)。要是回调是NULL指针,表示尚未回调函数的调用,仅第5个参数value有变化。
  • 第伍个参数,void*类型的userdata,他也有暗中认可值0。那么些参数是用户传给回调函数的数额,用来拍卖轨迹条事件。假使运用的第三个参数value实参是全局变量的话,完全能够不去管那么些userdata参数。

************************************************************************************************************************************

7.取妥当前轨道条的职位:

 
7:Laplace算子定义:http://blog.csdn.net/poem\_qianmo/article/details/25560901

int getTrackbarPos(conststring& trackbarname, conststring& winname); 

     依照图像处理的原理大家知道,二阶导数能够用来实行检查评定边缘 。
因为图像是 “2维”, 大家供给在四个样子拓展求导。使用Laplacian算子将      
     会使求导进程变得简单。

  • 率先个参数,const string&类型的trackbarname,表示轨迹条的名字。
  • 第三个参数,const string&类型的winname,表示轨迹条的父窗口的名目。

    //制造轨迹条
    createTrackbar(“比较度:”, “【效果图窗口】”,&g_nContrastValue, 300,ContrastAndBright );
    // g_nContrastValue为全局的整型变量,ContrastAndBright为回调函数的函数名(即指向函数地址的指针)

    1 //———————————–【头文件包涵部分】—————————————
    2 // 描述:包含程序所依靠的头文件
    3 //———————————————————————————————-
    4 #include “opencv2/imgproc/imgproc.hpp”
    5 #include “opencv2/highgui/highgui.hpp”
    6 #include
    7
    八 //———————————–【命名空间申明部分】—————————————
    玖 // 描述:包涵程序所使用的命名空间
    10 //———————————————————————————————–
    11 using namespace cv;
    12 using namespace std;
    13
    1四 //———————————–【全局函数注脚部分】————————————–
    15 // 描述:全局函数评释
    16 //———————————————————————————————–
    17 Mat img;
    1八 int threshval = 160; //轨迹条滑块对应的值,给初值160
    19
    20 //—————————–【on_trackbar( )函数】————————————
    二一 // 讲述:轨迹条的回调函数
    22 //———————————————————————————————–
    23 static void on_trackbar(int, void*)
    24 {
    25 Mat bw = threshval < 128 ? (img < threshval) : (img > threshval);
    26
    27 //定义点和向量
    28 vector > contours;
    29 vector hierarchy;
    30
    3壹 //查找概略
    32 findContours( bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
    33 //初始化dst
    34 Mat dst = Mat::zeros(img.size(), CV_8UC3);
    35 //开首次拍卖卖
    36 if( !contours.empty() && !hierarchy.empty() )
    37 {
    3八 //遍历全体顶层轮廓,随机生成颜色值绘制给各连接组成都部队分
    39 int idx = 0;
    40 for( ; idx >= 0; idx = hierarchy[idx][0] )
    41 {
    42 Scalar color( (rand()&255), (rand()&255), (rand()&255) );
    4叁 //绘制填充概况
    44 drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy );
    45 }
    46 }
    四七 //展现窗口
    48 imshow( “Connected Components”, dst );
    49 }
    50
    51
    52 //———————————–【main( )函数】——————————————–
    53 // 描述:控制台应用程序的入口函数,大家的次序从那里起初
    54 //———————————————————————————————–
    55 int main( )
    56 {
    57 system(“color 5F”);
    5八 //载入图片
    59 img = imread(“1.jpg”, 0);
    60 if( !img.data ) { printf(“Oh,no,读取img图片文件漏洞百出~! \n”); return -1; }
    61
    6二 //显示原图
    63 namedWindow( “Image”, 1 );
    64 imshow( “Image”, img );
    65
    6陆 //创立处理窗口
    67 namedWindow( “Connected Components”, 1 );
    6八 //创设轨迹条
    69 createTrackbar( “Threshold”, “Connected Components”, &threshval, 255, on_trackbar );
    70 on_trackbar(threshval, 0);//轨迹条回调函数
    71
    72 waitKey(0);
    73 return 0;
    74 }

         Laplacian 算子的定义: 

         Laplacian(
)函数其实根本是利用sobel算子的演算。它经过丰盛sobel算子运算出的图像x方向和y方向上的导数,来赢得大家载入图像的拉普拉
           斯变换结果。

****************************************************************************************************************************************************************************************

    捌:openCV图像金字塔

       那么,大家接下去一起看壹看拉普罗斯金字塔的概念呢

    
 两者的简便分化:高斯金字塔用来向下跌采集样品图像,而拉普腊斯克in字塔则用来从金字塔底层图像中提升采集样品重建3个图像。

  • 对图像向上采集样品:pyrUp函数(图像尺寸加倍,图像首先在每一个维度上扩充为本来的两倍,新增的行(偶数行)以0填充。然后给钦命的滤波器进行卷积(实际上是1个在各样维度都增添为本来两倍的过滤器)去臆度“丢失”像素的近似值。)
  • 对图像向下采集样品:pyrDown函数

      
 那里的向下与进步采集样品,是对图像的尺码而言的(和金字塔的来头相反),向上便是图像尺寸加倍,向下便是图像尺寸减半。而假若大家按上海体育场合中
       演示的金字塔方          
一贯驾驭,金字塔向上航海用教室像其实在减弱,那样恰好是扭曲了。

 

       高斯金字塔:

     
 高斯金字塔是通过高斯平滑和亚采样获得部分列下采集样品图像,也正是说第K层高斯金字塔通过平滑、亚采样就可以收获K+一层高斯图像,高斯金字塔包括了一文山会海低通滤波
     
 器,其直至频率从上1层到下1层是以因子二逐年增多,所以高斯金字塔能够超过极大的作用范围

  8.一 :对图像的向下取样

        为了拿走层级为 G_i+一 的金字塔图像,大家选取如下方法:

       <1>对图像G_i实行高斯内核卷积

       <二>将享有偶数行和列去除

     
 获得的图像即为G_i+1的图像,由此可见,结果图像唯有原图的四分之一。通过对输入图像G_i(原始图像)不停迭代上述步骤就会得到全方位金字塔。同时我们也能够看到,
         向下取样会日渐丢失图像的音讯。

       以上正是对图像的向下取样操作,即收缩图像。

 

  八.贰: 对图像的进化取样

       假如想放大图像,则需求经过进步取样操作获得,具体做法如下:

      <1>将图像在各类方向扩大为本来的两倍,新增的行和列以0填充

      <2>使用从前一模一样的内核(乘以四)与推广后的图像卷积,获得“新增像素”的近似值

     
得到的图像即为放大后的图像,可是与原来的图像比较会发觉相比模糊,因为在缩放的长河中一度不翼而飞了一些音讯,尽管想在减弱和放大整个经过中减弱音信的丢失,那几个      数据形成了拉普Ruskin字塔。

      那么,大家接下去一起看一看拉普Ruskin字塔的定义吗

****************************************************************************************************************************************************************************************

 9:resize函数剖析

 
 void resize(InputArray src,OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)

  • 先是个参数,InputArray类型的src,输入图像,即源图像,填Mat类的靶子即可。
  • 其次个参数,OutputArray类型的dst,输出图像,当其非零时,有着dsize(第多个参数)的尺寸,大概由src.size()总计出来。
  • 其八个参数,Size类型的dsize,输出图像的大小
  • 第多个参数,double类型的fx,沿水平轴的缩放周详,有暗许值0
  • 第伍个参数,double类型的fy,沿垂直轴的缩放周到,有私下认可值0
  • 第六个参数,double类型的fy,沿垂直轴的缩放周详,有暗中同意值0

     resize( )为OpenCV中等专业余学校园职调整图像大小的函数。

   
 此函数将源图像准确地更换为钦定尺寸的指标图像。假使源图像中设置了ROI(Region
Of Interest ,感兴趣区域),那么resize(
)函数会对源图像的ROI区域进行调整图      
 像尺寸的操作,来输出到目的图像中。若目的图像中曾经安装ROI区域,简单理解resize(
)将会对源图像进行尺寸调整并填充到目的图像的ROI中。

   
 很多时候,我们并不用思考第二个参数dst的起来图像尺寸和项目(即直接定义二个Mat类型,不用对其先河化),因为其尺寸和品种可以由src,dsize,fx和fy那此外的多少个       参数来规定。

****************************************************************************************************************************************************************************************

拾:pryUp函数剖析

       pyrUp(
)函数的效劳是提升采集样品并模糊一张图像,说白了正是加大学一年级张图纸

       void pyrUp(InputArray src, OutputArraydst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT )
 

  • 首先个参数,InputArray类型的src,输入图像,即源图像,填Mat类的靶子即可。
  • 其次个参数,OutputArray类型的dst,输出图像,和源图片有相同的尺寸和连串。
  • 其四个参数,const
    Size&类型的dstsize,输出图像的高低;有暗中认可值Size(),即暗中认可意况下,由Size(src.cols*2,src.rows*2)来进行总计,
  • 第五个参数,int类型的borderType,又来了,边界格局,1般大家不用去管它。

**********************************************************************************************************************************************************

   1一:openCV霍夫变换

       霍夫变换(Hough
Transform)是图像处理中的一种特征提取技术,该过程在贰个参数空间中通过计算累计结果的1对最大值得到1个适合该特定
         
形状的集结作为霍夫变换结果。霍夫变换运用多少个坐标空间之间的变换将在多少个空中中享有同样形状的曲线或直线映射到另3个坐标空间的三个         
点上形成峰值,从而把检查实验任意形状的标题转化为计算峰值难题,霍夫变换在OpenCV中分为霍夫线变换和霍夫圆变换二种。

       壹:霍夫线变换        

            大家了然,霍夫线变换是一种用来搜寻直线的方法.
在使用霍夫线变换从前,
首先要对图像举办边缘检验的拍卖,也即霍夫线变换的第三手输入只可以是边缘二值图像.

            总括一下,OpenCV中的霍夫线变换有如下二种:

                <一>标准霍夫变换(斯坦dardHough
Transform,SHT),由HoughLines函数调用。

                <二>多规格霍夫变换(Multi-ScaleHough
Transform,MSHT),由HoughLines函数调用。

                <三>累计可能率霍夫变换(ProgressiveProbabilistic
Hough Transform,PPHT),由HoughLinesP函数调用。

           大家得以对图像中兼有的点展开上述操作.
尽管五个不一样点进行上述操作后取得的曲线在平面图片 1会友,
那就表示它们通过同样条直线。

 

           以上的认证评释,壹般的话,
一条直线能够因而在平面 图片 2 寻找交于一点的曲线数量来检查评定。而愈多曲线交于一点也就代表这些交点表示的直线由
                           愈多的点组成.
1般的话大家得以经过设置直线上点的阈值来定义多少条曲线交于一点大家才认为检验到了一条直线。

           这就是霍夫线变换要做的. 它追踪图像中种种点对应曲线间的交点.
若是交于一点的曲线的多少抢先了阈值,
那么可以认为那些交点所代表的参数对图片 3在原图
             像中为一条直线。

      二:houghLines函数详解

         
 大家得以用其来调用标准霍夫变换SHT和多尺度霍夫变换MSHT的OpenCV内建算法。

           void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 ) 

     
具体见:http://blog.csdn.net/poem_qianmo/article/details/26977557

***********************************************************************************************************************************

  12:openCV角点检查评定之哈Rees角点检测

 

          当前的图像处理领域,角点检查测试算法可回顾为3类:

        <1>基于灰度图像的角点检查评定

        <2>基于2值图像的角点检查测试

       <3>基于概况曲线的角点检查测试

     
 “假使某一点在4意方向的三个1线转移都会挑起灰度十分大的成形,那么大家就把它叫做角点“  

 

除此以外,关于角点的现实性讲述能够有两种:

  • 1阶导数(即灰度的梯度)的一些最大所对应的像素点;
  • 两条及两条以下面缘的交点;
  • 图像中梯度值和梯度方向的成形速率都很高的点;
  • 角点处的一阶导数最大,二阶导数为零,提示物体边缘变化不总是的方向。

corner哈Rees函数详解

corner哈Rees函数用于在OpenCV中运转哈Rees角点检查实验算子处理图像。corner哈Rees函数对于每一个像素(x,y)在图片 4邻域内,总结二x二梯度的协方差矩阵图片 5,接着它计算如下式子:图片 6 ,即能够找出输出图中的局地最大值,即找出了角点。

函数原型:

class=”keyword”>void cornerHarris(InputArray src,OutputArray dst,  class=”datatypes”>int blockSize,  class=”datatypes”>int ksize,  class=”datatypes”>double k, intborderType=BORDER_DEFAULT )  

  • 首先个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为单通道5个人大概浮点型图像。
  • 其次个参数,OutputArray类型的dst,函数调用后的运算结果存在那里,即那一个参数用于存放哈Rees角点检查评定的输出结果,和源图片有一样的尺寸和项目。
  • 其多个参数,int类型的blockSize,表示邻域的尺寸,更加多的详细消息在cornerEigenValsAndVecs()中有讲到。
  • 第多少个参数,int类型的ksize,表示Sobel()算子的孔径大小。
  • 第伍个参数,double类型的k,Harris参数。
  • 第伍个参数,int类型的borderType,图像像素的疆界格局,注意它有私下认可值BO奥迪Q5DE瑞虎_DEFAULT。更详尽的诠释,参考borderInterpolate(
    )函数。

    class=”datatypes”>double threshold(InputArray src,OutputArray dst,  class=”datatypes”>double thresh,  class=”datatypes”>double maxval, int type)  

函数Threshold( )
对单通道数组应用固定阈值操作。该函数的独占鳌头应用是对灰度图像进行阈值操作得到2值图像。(此外,compare(
)函数也足以达到规定的标准此目标)
恐怕是去掉噪声,例如过滤相当的小或极大象素值的图像点。

  • 第2个参数,InputArray类型的src,输入数组,填单通道 ,
    八或三拾1人浮点类型的Mat即可。
  • 其次个参数,OutputArray类型的dst,函数调用后的运算结果存在那里,即那个参数用于存放输出结果,且和率先个参数中的Mat变量有同样的尺寸和档次。
  • 其多少个参数,double类型的thresh,阈值的具体值。
  • 第多个参数,double类型的maxval,当第陆个参数阈值类型type取
    CV_THRESH_BINARY 或CV_THRESH_BINARY_INV 阈值类型时的最大值.
  • 第五个参数,int类型的type,阈值类型,。threshold(
    )函数援救的对图像取阈值的法子由其规定,
  • http://blog.csdn.net/poem\_qianmo/article/details/29356187(不是特别明白里面的一些函数)
  • ************************************************************************************************************************************************************************

13:重映射与SUQashqaiF点质量评定

        重映射

       SURF点检测

     
 OpenCV中有关SURubiconF算法的1部分,平常提到到的是SURFSurfFeatureDetectorSurfDescriptorExtractor这三个类,这一小节我们就来对他们进行人肉,挖
     挖其背景,看看她们到底是怎么来头。

     

 绘制关键点的函数:drawKeypoints( )

void drawKeypoints( class=”keyword”>const Mat&image,  class=”keyword”>const vector<KeyPoint>& keypoints, Mat& outImage, constScalar& color=Scalar::all(-1), 

                 
 int flags=DrawMatchesFlags::DEFAULT)

  • 首先个参数,const Mat&类型的src,输入图像。
  • 其次个参数,const
    vector<KeyPoint>&类型的keypoints,根据源图像得到的特征点,它是三个出口参数。
  • 其多少个参数,Mat&类型的outImage,输出图像,其内容在于第伍个参数标识符falgs。
  • 第多个参数,const
    Scalar&类型的color,关键点的颜料,有暗中认可值Scalar::all(-一)。
  • 第5个参数,int类型的flags,绘制关键点的本性标识符,有私下认可值DrawMatchesFlags::DEFAULT。能够在如下这几个结构体中甄选值。

SU兰德酷路泽F检验大概代码:
        Mat srcImage1 =
imread(“D:/TEST_GIT/test2/img/book1.jpg”,1);
Mat srcImage2 = imread(“D:/TEST_GIT/test2/img/book2.jpg”,2);
//【二】定义必要动用的变量和类  
int minHessian = 400; //定义SU凯雷德F中的hessian阈值特征点检验算子  
SurfFeatureDetector detector(minHessian);
//定义2个SurfFeatureDetector(SU奥迪Q7F) 特征检测类对象  
std::vector<KeyPoint> keypoints_1, keypoints_二;
//vector模板类是力所能及存舍弃意档次的动态数组,能够扩张和削减数量  
//【3】调用detect函数检验出SULacrosseF特征关键点,保存在vector容器中  
detector.detect(srcImage1, keypoints_1);
detector.detect(srcImage2, keypoints_2); 
//【肆】绘制特征关键点  
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints(srcImage1, keypoints_1, img_keypoints_1,
Scalar::all(-1), DrawMatchesFlags::DEFAULT);
drawKeypoints(srcImage2, keypoints_2, img_keypoints_2,
Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//【伍】呈现效果图  
imshow(“特征点检查测试效果图一”, img_keypoints_1);
imshow(“特征点检查评定效果图2”, img_keypoints_2);

 

     
 在OpenCV中,使用SUCRUISERF进行特征点描述重假如drawMatches方法和BruteForceMatcher类的应用,让我们一道来认识他们。

       

  1. C++: void drawMatches( class=”keyword”>const Mat& img1,  
  2. constvector<KeyPoint>& keypoints1,  
  3.  const Mat& img2,  
  4.  constvector<KeyPoint>& keypoints2,  
  5.  constvector<DMatch>& matches1to2,  
  6.  Mat& outImg,  
  7.   class=”keyword”>const Scalar&matchColor=Scalar::all(-1),  
  8.   class=”keyword”>const Scalar&singlePointColor=Scalar::all(-1),  
  9.  const vector< class=”datatypes”>char>&matchesMask=vector< class=”datatypes”>char>(),  
  10.  intflags=DrawMatchesFlags::DEFAULT )  

  drawMatches用于绘制出相相称的五个图像的关键点

  • 首先个参数,const Mat&类型的img1,第一幅源图像。
  • 第一个参数,const
    vector<KeyPoint>&类型的keypoints一,遵照第叁幅源图像得到的特征点,它是四个输出参数。
  • 其四个参数,const Mat&类型的img2,第三幅源图像。
  • 第多个参数,const
    vector<KeyPoint>&类型的keypoints2,依照第贰幅源图像得到的特征点,它是1个输出参数。
  • 第陆个参数,matches壹to二,第一幅图像到第三幅图像的相配点,即意味着每1个图第11中学的特征点都在图2中有各类对应的点、
  • 第陆个参数,Mat&类型的outImg,输出图像,其内容在于第伍个参数标识符falgs。
  • 首个参数,const
    Scalar&类型的matchColor,相称的出口颜色,即线和关键点的颜色。它有暗中同意值Scalar::all(-一),表示颜色是随机生成的。
  • 第多个参数,const
    Scalar&类型的singlePointColor,单壹特征点的颜色,它也有代表随机生成颜色的暗中认可值Scalar::all(-一)。
  • 第九个参数,matchesMask,鲜明什么相配是会绘制出来的掩膜,借使掩膜为空,表示全体匹配都进展绘图。
  • 第10个参数,int类型的flags,特征绘制的标识符,有暗许值DrawMatchesFlags::DEFAULT。可以在如下这些DrawMatchesFlags结构体中选用值:

    BruteForceMatcher类源码分析

    

而大家用BruteForceMatcher类时用到最多的match方法,是它从DescriptorMatcher类那里的“拿来主义”。定义如下:

  1. class=”comment”>//为各样描述符找到多个特级的相当(若掩膜为空)  
  2. CV_WRAP void match(  class=”keyword”>const Mat& queryDescriptors,  class=”keyword”>const Mat&trainDescriptors,  
  3.              CV_OUTvector<DMatch>& matches,  class=”keyword”>const Mat& mask=Mat() )  class=”keyword”>const;

 

程序行使了SU大切诺基F特征的特征描述办法,其操作封装在类SurfFeatureDetector中,利用类内的detect函数能够检查实验出SU路虎极光F特征的关键点,保存在vector容器中。第三步利用SurfDescriptorExtractor类举行特征向量的相关测算。将事先的vector变量变成向量矩阵情势保留在Mat中。最后强行相称两幅图像的特征向量,利用了类BruteForceMatcher中的函数match。

先后的大旨绪想是:

  • 利用 DescriptorExtractor
    接口来探寻关键点对应的特征向量。detector(srcImage,keyPoints)方法
  • 动用 SurfDescriptorExtractor 以及它的函数 compute
    来完毕一定的估摸。compute(srcImage,keyPoints, descriptor)方法
  • 利用 BruteForceMatcher
    来合营特征向量。match(descriptor1,descriptor2,matches)方法
  • 动用函数 drawMatches 来绘制检查评定到的相称点.drawMatches( srcImage一,
    keyPoint一, srcImage二, keyPoints二, matches, imgMatches)

相关文章