国产在线视频精品视频,国产亚洲精品久久久久久青梅 ,国产麻豆精品一区,国产真实乱对白精彩久久,国产精品视频一区二区三区四

您的位置:基金>正文

OpenCV常用庫(kù)函數(shù)

來(lái)源:QT高級(jí)進(jìn)階2023-08-04 13:35:08

一、core 模塊

1、Mat - 基本圖像容器

Mat 是一個(gè)類,由兩個(gè)數(shù)據(jù)部分組成:矩陣頭(包含矩陣尺寸,存儲(chǔ)方法,存儲(chǔ)地址等信息)和一個(gè)指向存儲(chǔ)所有像素值的矩陣(根據(jù)所選存儲(chǔ)方法的不同矩陣可以是不同的維數(shù))的指針。


(資料圖片)

創(chuàng)建Mat對(duì)象方法:

1->Mat() 構(gòu)造函數(shù):Mat M(2,2, CV_8UC3, Scalar(0,0,255));int sz[3] = {2,2,2};Mat L(3,sz, CV_8UC(1), Scalar::all(0));2->Create() function: 函數(shù)M.create(4,4, CV_8UC(2));3-> 初始化zeros(), ones(), :eyes()矩陣Mat E = Mat::eye(4, 4, CV_64F);Mat O = Mat::ones(2, 2, CV_32F);Mat Z = Mat::zeros(3,3, CV_8UC1);4->用逗號(hào)分隔的初始化函數(shù):Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

常用操作:

Mat A, C;                                 // 只創(chuàng)建信息頭部分A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 這里為矩陣開(kāi)辟內(nèi)存Mat B(A);                                 // 使用拷貝構(gòu)造函數(shù)C = A;                                    // 賦值運(yùn)算符Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangleMat E = A(Range:all(), Range(1,3)); // using row and column boundariesMat F = A.clone();Mat G;A.copyTo(G);                       //使用函數(shù) clone() 或者 copyTo() 來(lái)拷貝一副圖像的矩陣。

2、圖像基本操作(Mat操作)

2.1 濾波器掩碼

濾波器在圖像處理中的應(yīng)用廣泛,OpenCV也有個(gè)用到了濾波器掩碼(也稱作核)的函數(shù)。使用這個(gè)函數(shù),你必須先定義一個(gè)表示掩碼的 Mat 對(duì)象:

Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,                                -1,  5, -1,                                 0, -1,  0); filter2D(I, K, I.depth(), kern );

2.2 圖像混合(addWeighted函數(shù))

線性混合操作也是一種典型的二元(兩個(gè)輸入)的 像素操作

alpha = 0.3; beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0, dst);

2.3 改變圖像的對(duì)比度和亮度
兩種常用的點(diǎn)過(guò)程(即點(diǎn)算子),是用常數(shù)對(duì)點(diǎn)進(jìn)行 乘法 和 加法 運(yùn)算:

double alpha;int beta;Mat image = imread( argv[1] );Mat new_image = Mat::zeros( image.size(), image.type() );for( int y = 0; y < image.rows; y++ ){    for( int x = 0; x < image.cols; x++ )    {        for( int c = 0; c < 3; c++ )        {            new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );        }    }}

2.4 離散傅立葉變換

領(lǐng)Qt開(kāi)發(fā)資料→Qt開(kāi)發(fā)(視頻教程+文檔+代碼+項(xiàng)目實(shí)戰(zhàn))

對(duì)一張圖像使用傅立葉變換就是將它分解成正弦和余弦兩部分。也就是將圖像從空間域(spatial domain)轉(zhuǎn)換到頻域(frequency domain)。 2維圖像的傅立葉變換可以用以下數(shù)學(xué)公式表達(dá):

式中 f 是空間域(spatial domain)值, F 則是頻域(frequency domain)值。

Mat padded;          //將輸入圖像延擴(kuò)到最佳的尺寸int m = getOptimalDFTSize( I.rows );int n = getOptimalDFTSize( I.cols ); // 在邊緣添加0copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};Mat complexI;merge(planes, 2, complexI);         // 為延擴(kuò)后的圖像增添一個(gè)初始化為0的通道dft(complexI, complexI);            // 變換結(jié)果很好的保存在原始矩陣中split(complexI, planes);                   // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitudeMat magI = planes[0];

2.5 基本繪圖

Point:    Point pt;    pt.x = 10;    pt.y = 8;    或者    Point pt =  Point(10, 8);Scalar:    Scalar( B, G, R )   //定義的RGB顏色值為:Blue,Green, Redline 繪直線:    line( img,   //輸出圖像        start,   //起始點(diǎn)        end,     //結(jié)束點(diǎn)        Scalar( 0, 0, 0 ),  //顏色        thickness=2,    //線條粗細(xì)        lineType=8 );   //線條類型ellipse 繪橢圓:    ellipse( img,   //輸出圖像           Point( w/2.0, w/2.0 ),   //中心為點(diǎn) (w/2.0, w/2.0)           Size( w/4.0, w/16.0 ),     //大小位于矩形 (w/4.0, w/16.0) 內(nèi)           angle,    //旋轉(zhuǎn)角度為 angle           0,           360,     //擴(kuò)展的弧度從 0 度到 360 度           Scalar( 255, 0, 0 ),   //顏色           thickness,   //線條粗細(xì)           lineType );    //線條類型circle 繪圓:    circle( img,   //輸出圖像         center,    //圓心由點(diǎn) center 定義         w/32.0,     /圓的半徑為: w/32.0         Scalar( 0, 0, 255 ),   //顏色         thickness,   //線條粗細(xì)         lineType );   //線條類型rectangle 繪矩形:    rectangle( rook_image,           Point( 0, 7*w/8.0 ),           Point( w, w),    //矩形兩個(gè)對(duì)角頂點(diǎn)為 Point( 0, 7*w/8.0 ) 和 Point( w, w)           Scalar( 0, 255, 255 ),           thickness = -1,           lineType = 8 );fillPoly 繪填充的多邊形:    fillPoly( img,            ppt,   //多邊形的頂點(diǎn)集為 ppt            npt,   //要繪制的多邊形頂點(diǎn)數(shù)目為 npt            1,   //要繪制的多邊形數(shù)量?jī)H為 1            Scalar( 255, 255, 255 ),            lineType );

2.6 隨機(jī)數(shù)發(fā)生器

RNG的實(shí)現(xiàn)了一個(gè)隨機(jī)數(shù)發(fā)生器。 在上面的例子中, rng 是用數(shù)值 0xFFFFFFFF 來(lái)實(shí)例化的一個(gè)RNG對(duì)象。

RNG rng( 0xFFFFFFFF );  

二、imgproc 模塊

1、圖像平滑處理

不妨把 濾波器想象成一個(gè)包含加權(quán)系數(shù)的窗口,當(dāng)使用這個(gè)濾波器平滑處理圖像時(shí),就把這個(gè)窗口滑過(guò)圖像。

1.1 歸一化塊濾波器 (Normalized Box Filter)

1 blur( src,    //輸入圖像2       dst,    //輸出圖像3       Size( i, i ),    //定義內(nèi)核大小( w 像素寬度, h 像素高度)4       Point(-1,-1))    //指定錨點(diǎn)位置(被平滑點(diǎn)), 如果是負(fù)值,取核的中心為錨點(diǎn)。

1.2 高斯濾波器 (Gaussian Filter)

GaussianBlur( src,    //輸入圖像              dst,     //輸出圖像              Size( i, i ),    //定義內(nèi)核的大小(需要考慮的鄰域范圍)。  w 和 h 必須是正奇數(shù),否則將使用  和  參數(shù)來(lái)計(jì)算內(nèi)核大小。              0,    //: x 方向標(biāo)準(zhǔn)方差, 如果是 0 則  使用內(nèi)核大小計(jì)算得到。              0 )    //: y 方向標(biāo)準(zhǔn)方差, 如果是 0 則  使用內(nèi)核大小計(jì)算得到。

1.3 中值濾波器 (Median Filter)

1 medianBlur ( src,   //輸入圖像2              dst,    //輸出圖像3              i );    //內(nèi)核大小 (只需一個(gè)值,因?yàn)槲覀兪褂谜叫未翱?,必須為奇數(shù)。

1.4 雙邊濾波 (Bilateral Filter)

bilateralFilter ( src,  //輸入圖像           dst,    //輸出圖像           i,     //像素的鄰域直徑           i*2,    //: 顏色空間的標(biāo)準(zhǔn)方差           i/2 );    //: 坐標(biāo)空間的標(biāo)準(zhǔn)方差(像素單位)

2、形態(tài)學(xué)變換

形態(tài)學(xué)操作就是基于形狀的一系列圖像處理操作。最基本的形態(tài)學(xué)操作有二:腐蝕與膨脹(Erosion 與 Dilation)。 他們的運(yùn)用廣泛:

消除噪聲
分割(isolate)獨(dú)立的圖像元素,以及連接(join)相鄰的元素。
尋找圖像中的明顯的極大值區(qū)域或極小值區(qū)域。
2.1 腐蝕(Erosion)

此操作將圖像 A 與任意形狀的內(nèi)核 B(通常為正方形或圓形)進(jìn)行卷積,將內(nèi)核 B 覆蓋區(qū)域的最小相素值提取,并代替錨點(diǎn)位置的相素。這一操作將會(huì)導(dǎo)致圖像中的亮區(qū)開(kāi)始“收縮”。

erode(  src,   //原圖像        erosion_dst,    //輸出圖像        element );   //腐蝕操作的內(nèi)核,默認(rèn)為一個(gè)簡(jiǎn)單的 3x3 矩陣。也可以使用函數(shù) getStructuringElement。Mat element = getStructuringElement( erosion_type,                                     Size( 2*erosion_size + 1, 2*erosion_size+1 ),                                     Point( erosion_size, erosion_size ) );

2.2 膨脹 (Dilation)

此操作將圖像 A 與任意形狀的內(nèi)核 B(通常為正方形或圓形)進(jìn)行卷積,將內(nèi)核 B 覆蓋區(qū)域的最大相素值提取,并代替錨點(diǎn)位置的相素。這一操作將會(huì)導(dǎo)致圖像中的亮區(qū)開(kāi)始“擴(kuò)展”。

ditale( src,   //原圖像        dilate_dst,    //輸出圖像        element );   //腐蝕操作的內(nèi)核,默認(rèn)為一個(gè)簡(jiǎn)單的 3x3 矩陣。也可以使用函數(shù) getStructuringElement。Mat element = getStructuringElement( dilation_type,                                     Size( 2*dilation_size + 1, 2*dilation_size+1 ),                                     Point( dilation_size, dilation_size ) );

2.3 開(kāi)運(yùn)算 (Opening)

開(kāi)運(yùn)算是通過(guò)先對(duì)圖像腐蝕再膨脹實(shí)現(xiàn)的。能夠排除小團(tuán)塊物體(假設(shè)物體較背景明亮)。

2.4 閉運(yùn)算(Closing)

閉運(yùn)算是通過(guò)先對(duì)圖像膨脹再腐蝕實(shí)現(xiàn)的。能夠排除小型黑洞(黑色區(qū)域)。

2.5 形態(tài)梯度(Morphological Gradient)

膨脹圖與腐蝕圖之差。能夠保留物體的邊緣輪廓。

2.6 頂帽(Top Hat)

原圖像與開(kāi)運(yùn)算結(jié)果圖之差。

2.7 黑帽(Black Hat)

閉運(yùn)算結(jié)果圖與原圖像之差

3、圖像金字塔

一個(gè)圖像金字塔是一系列圖像的集合 - 所有圖像來(lái)源于同一張?jiān)紙D像 - 通過(guò)梯次向下采樣獲得,直到達(dá)到某個(gè)終止條件才停止采樣。有兩種類型的圖像金字塔常常出現(xiàn)在文獻(xiàn)和應(yīng)用中:
高斯金字塔(Gaussian pyramid): 用來(lái)向下采樣

拉普拉斯金字塔(Laplacian pyramid): 用來(lái)從金字塔低層圖像重建上層未采樣圖像

將所有偶數(shù)行和列去除。

pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) );

對(duì)圖像的向下采樣:

將圖像在每個(gè)方向擴(kuò)大為原來(lái)的兩倍,新增的行和列以0填充()使用先前同樣的內(nèi)核(乘以4)與放大后的圖像卷積,獲得 “新增像素” 的近似值。
pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );

4、閾值操作

最簡(jiǎn)單的圖像分割的方法。 例如:可以將該物體的像素點(diǎn)的灰度值設(shè)定為:‘0’(黑色),其他的像素點(diǎn)的灰度值為:‘255’(白色);當(dāng)然像素點(diǎn)的灰度值可以任意,但最好設(shè)定的兩種顏色對(duì)比度較強(qiáng),方便觀察結(jié)果

threshold( src_gray,    //輸入的灰度圖像       dst,   //輸出圖像       threshold_value,   //進(jìn)行閾值操作時(shí)閾值的大小       max_BINARY_value,   //設(shè)定的最大灰度值       threshold_type );  // 閾值的類型。                           0: 二進(jìn)制閾值                           1: 反二進(jìn)制閾值                           2: 截?cái)嚅撝?                          3: 0閾值                           4: 反0閾值

5、給圖像添加邊界

圖像的卷積操作中,處理卷積邊緣時(shí)需要考慮邊緣填充。

copyMakeBorder( src,             dst,             top,bottom, left,right, //各邊界的寬度             borderType,     //邊界類型,可選擇常數(shù)邊界BORDER_CONSTANT或者復(fù)制邊界BORDER_REPLICATE。             value );    //如果 borderType 類型是 BORDER_CONSTANT, 該值用來(lái)填充邊界像素。

6、圖像卷積

6.1 函數(shù) filter2D 就可以生成濾波器

filter2D(src,         dst,         ddepth,   //dst 的深度。若為負(fù)值(如 -1 ),則表示其深度與源圖像相等。         kernel,   //用來(lái)遍歷圖像的核         anchor,   //核的錨點(diǎn)的相對(duì)位置,其中心點(diǎn)默認(rèn)為 (-1, -1) 。         delta,   //在卷積過(guò)程中,該值會(huì)加到每個(gè)像素上。默認(rèn)情況下,這個(gè)值為 0 。         BORDER_DEFAULT );   //默認(rèn)即可

6.2 Sobel 導(dǎo)數(shù)

Sobel 算子用來(lái)計(jì)算圖像灰度函數(shù)的近似梯度。Sobel 算子結(jié)合了高斯平滑和微分求導(dǎo)。

計(jì)算:

1.在兩個(gè)方向求導(dǎo):

/// 求 X方向梯度  //Scharr( src_gray, grad_x, ddepth, x_order=1, y_order=0, scale, delta, BORDER_DEFAULT );  Sobel( src_gray, grad_x, ddepth, x_order=1, y_order=0, 3, scale, delta, BORDER_DEFAULT );  convertScaleAbs( grad_x, abs_grad_x );       //將中間結(jié)果轉(zhuǎn)換到 CV_8U  /// 求Y方向梯度  //Scharr( src_gray, grad_y, ddepth, x_order=0, y_order=1, scale, delta, BORDER_DEFAULT );  Sobel( src_gray, grad_y, ddepth, x_order=0, y_order=1, 3, scale, delta, BORDER_DEFAULT );  convertScaleAbs( grad_y, abs_grad_y );  /// 合并梯度(近似)  addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

6.3 Laplace 算子

二階導(dǎo)數(shù)可以用來(lái) 檢測(cè)邊緣。 因?yàn)閳D像是 “2維”, 我們需要在兩個(gè)方向求導(dǎo)。使用Laplacian算子將會(huì)使求導(dǎo)過(guò)程變得簡(jiǎn)單。Laplacian 算子的定義:、
Laplacian( src_gray,           dst,           ddepth,        //輸出圖像的深度。 因?yàn)檩斎雸D像的深度是 CV_8U           kernel_size,   //內(nèi)部調(diào)用的 Sobel算子的內(nèi)核大小           scale,           delta,           BORDER_DEFAULT );

6.4 Canny 邊緣檢測(cè)

1. Canny 使用了滯后閾值,滯后閾值需要兩個(gè)閾值(高閾值和低閾值):

2. 如果某一像素位置的幅值超過(guò) 高 閾值, 該像素被保留為邊緣像素。
3.如果某一像素位置的幅值小于 低 閾值, 該像素被排除。
4.如果某一像素位置的幅值在兩個(gè)閾值之間,該像素僅僅在連接到一個(gè)高于 高 閾值的像素時(shí)被保留。
Canny 推薦的 高:低 閾值比在 2:1 到3:1之間

Canny(   detected_edges,   //原灰度圖像         detected_edges,   //輸出圖像         lowThreshold,   //低閾值         lowThreshold*ratio,   //設(shè)定為低閾值的3倍 (根據(jù)Canny算法的推薦)         kernel_size );   //設(shè)定為 3 (Sobel內(nèi)核大小,內(nèi)部使用)

6.5 霍夫線變換

霍夫線變換是一種用來(lái)尋找直線的方法.是用霍夫線變換之前, 首先要對(duì)圖像進(jìn)行邊緣檢測(cè)的處理,也即霍夫線變換的直接輸入只能是邊緣二值圖像.
Canny(src, dst, 50, 200, 3);  //用Canny算子對(duì)圖像進(jìn)行邊緣檢測(cè)vector<Vec2f> lines;/*標(biāo)準(zhǔn)霍夫線變換*/HoughLines(  dst,             lines,   //儲(chǔ)存著檢測(cè)到的直線的參數(shù)對(duì) (r,\theta) 的容器             rho=1,     //參數(shù)極徑 rho 以像素值為單位的分辨率.             CV_PI/180,   //參數(shù)極角 \theta 以弧度為單位的分辨率. 我們使用 1度 (即CV_PI/180)             threshold=100,             0,0 );    //srn and stn: 參數(shù)默認(rèn)為0.//通過(guò)畫(huà)出檢測(cè)到的直線來(lái)顯示結(jié)果.for( size_t i = 0; i < lines.size(); i++ ){  float rho = lines[i][0], theta = lines[i][1];  Point pt1, pt2;  double a = cos(theta), b = sin(theta);  double x0 = a*rho, y0 = b*rho;  pt1.x = cvRound(x0 + 1000*(-b));  pt1.y = cvRound(y0 + 1000*(a));  pt2.x = cvRound(x0 - 1000*(-b));  pt2.y = cvRound(y0 - 1000*(a));  line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);} /*統(tǒng)計(jì)概率霍夫線變換*/vector<Vec4i> lines;HoughLinesP( dst,             lines,   //儲(chǔ)存著檢測(cè)到的直線的參數(shù)對(duì) (x_{start}, y_{start}, x_{end}, y_{end}) 的容器             rho=1,    //參數(shù)極徑 rho 以像素值為單位的分辨率.             CV_PI/180,             threshold=50,   //要”檢測(cè)” 一條直線所需最少的的曲線交點(diǎn)             minLinLength=50,   //能組成一條直線的最少點(diǎn)的數(shù)量. 點(diǎn)數(shù)量不足的直線將被拋棄.             maxLineGap=10 );   //能被認(rèn)為在一條直線上的亮點(diǎn)的最大距離.//通過(guò)畫(huà)出檢測(cè)到的直線來(lái)顯示結(jié)果.for( size_t i = 0; i < lines.size(); i++ ){  Vec4i l = lines[i];  line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);}

6.6 霍夫圓變換

霍夫圓變換的基本原理和上個(gè)教程中提到的霍夫線變換類似, 只是點(diǎn)對(duì)應(yīng)的二維極徑極角空間被三維的圓心點(diǎn)x, y還有半徑r空間取代.

GaussianBlur( src_gray, src_gray, Size(9, 9), 2, 2 );   //高斯模糊以降低噪聲vector<Vec3f> circles;HoughCircles( src_gray,   //輸入圖像 (灰度圖)              circles,   //存儲(chǔ)下面三個(gè)參數(shù): x_{c}, y_{c}, r 集合的容器來(lái)表示每個(gè)檢測(cè)到的圓.              CV_HOUGH_GRADIENT,   //指定檢測(cè)方法. 現(xiàn)在OpenCV中只有霍夫梯度法              dp = 1,   //累加器圖像的反比分辨率              min_dist = src_gray.rows/8,   //檢測(cè)到圓心之間的最小距離              param_1 = 200,    //   //圓心檢測(cè)閾值.              param_2 = 100,      //圓心檢測(cè)閾值.              0,    //能檢測(cè)到的最小圓半徑,默認(rèn)為0.              0 );   //能檢測(cè)到的最大圓半徑, 默認(rèn)為0//繪出檢測(cè)到的圓for( size_t i = 0; i < circles.size(); i++ ){   Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));   int radius = cvRound(circles[i][2]);   // circle center   circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );   // circle outline   circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );}

7、 Remapping 重映射

把一個(gè)圖像中一個(gè)位置的像素放置到另一個(gè)圖片指定位置的過(guò)程。

remap(   src,         dst,         map_x,   // x方向的映射參數(shù). 它相當(dāng)于方法 h(i,j) 的第一個(gè)參數(shù)         map_y,   //y方向的映射參數(shù). 注意 map_y 和 map_x 與 src 的大小一致。         CV_INTER_LINEAR,  //非整數(shù)像素坐標(biāo)插值標(biāo)志. 這里給出的是默認(rèn)值(雙線性插值).         BORDER_CONSTANT,   // 默認(rèn)         Scalar(0,0, 0) );

8、 仿射變換

一個(gè)任意的仿射變換都能表示為 乘以一個(gè)矩陣 (線性變換) 接著再 加上一個(gè)向量 (平移).

//映射的三個(gè)點(diǎn)來(lái)定義仿射變換:srcTri[0] = Point2f( 0,0 );srcTri[1] = Point2f( src.cols - 1, 0 );srcTri[2] = Point2f( 0, src.rows - 1 );dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );//getAffineTransform 來(lái)求出仿射變換warp_mat = getAffineTransform( srcTri, dstTri );warpAffine(  src,             warp_dst,             warp_mat,   //仿射變換矩陣             warp_dst.size() );   //輸出圖像的尺寸

9、 直方圖均衡化

直方圖均衡化是通過(guò)拉伸像素強(qiáng)度分布范圍來(lái)增強(qiáng)圖像對(duì)比度的一種方法.

equalizeHist( src, dst );

10、模板匹配

matchTemplate( img, templ, result, match_method );

三、feature2d 模塊. 2D特征框架

圖像特征類型:

邊緣角點(diǎn) (感興趣關(guān)鍵點(diǎn))斑點(diǎn)(Blobs) (感興趣區(qū)域)

1、Harris 角點(diǎn)檢測(cè)子

cornerHarris( src_gray,             dst,             blockSize=2,             apertureSize=3,             k=0.04,             BORDER_DEFAULT );/// Normalizingnormalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );convertScaleAbs( dst_norm, dst_norm_scaled );/// Drawing a circle around cornersfor( int j = 0; j < dst_norm.rows ; j++ )     { for( int i = 0; i < dst_norm.cols; i++ )          {            if( (int) dst_norm.at<float>(j,i) > thresh )              {               circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 );              }          }      }    /// Showing the result    namedWindow( corners_window, CV_WINDOW_AUTOSIZE );    imshow( corners_window, dst_norm_scaled );}

2、Shi-Tomasi角點(diǎn)檢測(cè)子

/// Apply corner detectiongoodFeaturesToTrack( src_gray,               corners,               maxCorners,               qualityLevel,               minDistance,               Mat(),               blockSize,               useHarrisDetector,               k );/// Draw corners detectedcout<<"** Number of corners detected: "<<corners.size()<<endl;int r = 4;for( int i = 0; i < corners.size(); i++ ){    circle( copy,     corners[i],     r,     Scalar(rng.uniform(0,255),     rng.uniform(0,255),     rng.uniform(0,255)), -1, 8, 0 );}/// Show what you gotnamedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, copy );

3、特征點(diǎn)檢測(cè)

//--Detect the keypoints using SURF Detector  int minHessian = 400;  SurfFeatureDetector detector( minHessian );  std::vector<KeyPoint> keypoints_1, keypoints_2;  detector.detect( img_1, keypoints_1 );  detector.detect( img_2, keypoints_2 ); //-- Draw keypoints  Mat img_keypoints_1; Mat img_keypoints_2;  drawKeypoints( img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );  drawKeypoints( img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT ); //-- Show detected (drawn) keypoints  imshow("Keypoints 1", img_keypoints_1 );  imshow("Keypoints 2", img_keypoints_2 );

相關(guān)內(nèi)容

Copyright @ 2008-2020 www.jjzkw.com.cn All Rights Reserved 基金周刊 版權(quán)所有
聯(lián)系我們:829 875 9@qq.com