OPENCV學習筆記 1

2021-05-25 20:01:08 字數 4488 閱讀 9090

剛上研一,本身想對嵌入式進行一番學習,結果實習的時候用opencv搞影象識別,有點讓人失望。不過畢竟是ai的電腦視覺方面的東西,所以也就報有很大熱情學的,業餘還得鞏固基礎c、c++的書(等把c++primer再看一遍後進軍sdk了,得等多久到mfc啊)。

csdn開了部落格,寫了些,後來才發現有學生大本營,決定在這安家落戶,畢竟還是學生嘛。

經過前面學習(圖形結構體陣列相關操作,opencv自帶gui控制項,的色彩變換以及座標變換),終於可以進入主題——影象識別了。

影象識別基礎是直方圖,在我看來好像一切都是重它開始的,比如說影象匹配其實是源影象直方圖和特徵影象直方圖進行數學比較得到的。

啥是直方圖?

在我看來就是一張統計圖,統計各個畫素在一定範圍內的數量。舉個例子:大家都知道一般rgb影象有3個通道分別是r,g,b。就拿紅色通道r來說,它的範圍有0-255,直方圖就是把它分為n個,每個塊是255/n(平均分),統計色彩在0-255/n的畫素點有多少個,255/n-255/n*2的畫素點,255/n*2-255/n*3的畫素點...

了解直方圖的結構和操作可以通過下面我對比兩張相識度來了解:

#include "stdafx.h"

#include

#include

int main(int argc, char** argv)

;cvsplit(hsv,h_plane,s_plane,v_plane,0);//split hsv to 3 channal

//求得直方圖

int h_bins=30,s_bins=32;

cvhistogram *hist1,*hist2;

int size=;

float h_ranges=;

float s_ranges=;

float *ranges=;

hist1=cvcreatehist(2,size,cv_hist_array,ranges,1);

cvcalchist(planes,hist1,0,0);//只能乙個通道乙個通道的寫入直方圖,所以上面分成h、s、v

cvnormalizehist(hist1,1.0);//歸一化直方圖,使所有塊的值加起來為1

hist2=cvcreatehist(2,size,cv_hist_array,ranges,1);

cvcalchist(planes,hist2,0,0);

cvnormalizehist(hist2,1.0);

//求得signature用於比較直方圖

cvmat *sig1,*sig2;

int numrows=h_bins*s_bins;

sig1=cvcreatemat(numrows,3,cv_32fc1);//由於是2維影象直方圖,所以只需儲存每個點的(值,橫座標,縱座標)三個數,一共numrows個點

sig2=cvcreatemat(numrows,3,cv_32fc1);

for(int h=0;h可以清楚的看出因為我對比同乙個影象直方圖,所以得數0是對的,完全一樣

return 0;

}程式不難,主要對於直方圖和rignature結構的理解!

當然opencv有封裝號的可以比較的函式——反向投影,模板匹配。

用直方圖比較來定位影象中的模板

void cvcalcbackprojectpatch( iplimage** image, cvarr* dst,

cvsize patch_size, cvhistogram* hist,

int method, float factor );

image

輸入影象 (可以傳遞 cvmat** )

dst

輸出影象.

patch_size

掃瞄輸入影象的補丁尺寸

hist

直方圖

method

比較方法,傳遞給 cvcomparehist (見該函式的描述).

factor

直方圖的歸一化因子,將影響輸出影象的歸一化縮放。如果為 1,則不定。

函式 cvcalcbackprojectpatch 通過輸入影象補丁的直方圖和給定直方圖的比較,來計算反向投影。提取影象在 roi 中每乙個位置的某種測量結果產生了陣列 image. 這些結果可以是色調, x 差分, y 差分, laplacian 濾波器, 有方向 gabor 濾波器等中 的乙個或多個。每種測量輸出都被劃歸為它自己的單獨影象。 image 影象陣列是這些測量影象的集合。乙個**直方圖 hist 從這些影象陣列中被取樣建立。最後直方圖被歸一化。直方圖 hist 的維數通常很大等於影象陣列 image 的元素個數。

在選擇的 roi 中,每乙個新的影象被測量並且轉換為乙個影象陣列。在以錨點為「補丁」中心的影象 image 區域中計算直方圖 (如下圖所示)。用引數 norm_factor 來歸一化直方圖,使得它可以與 hist 互相比較。計算出的直方圖與直方圖模型互相比較, (hist 使用函式 cvcomparehist ,比較方法是 method=method). 輸出結果被放置到概率影象 dst 補丁錨點的對應位置上。這個過程隨著補丁滑過整個 roi 而重複進行。迭代直方圖的更新可以通過在原直方圖中減除「補丁」已覆蓋的尾象素點或者加上新覆蓋的象素點來實現,這種更新方式可以節省大量的操作,儘管目前在函式體中還沒有實現。

void cvmatchtemplate( const cvarr* image, const cvarr* templ,

cvarr* result, int method );

image

欲搜尋的影象。它應該是單通道、8-位元或32-位元 浮點數影象

templ

搜尋模板,不能大於輸入影象,且與輸入影象具有一樣的資料型別

result

比較結果的對映影象。單通道、32-位元浮點數. 如果影象是 w×h 而 templ 是 w×h ,則 result 一定是 (w-w+1)×(h-h+1).

method

指定匹配方法:

函式 cvmatchtemplate 與函式 cvcalcbackprojectpatch 類似。它滑動過整個影象 image, 用指定方法比較 templ 與影象尺寸為 w×h 的重疊區域,並且將比較結果存到 result 中。 下面是不同的比較方法,可以使用其中的一種

method=cv_tm_sqdiff:

method=cv_tm_sqdiff_normed:

method=cv_tm_ccorr:

method=cv_tm_ccorr_normed:

method=cv_tm_ccoeff:

給後面的matchtempate加個例子把:

int main( int argc, char** argv )

//read in the source image to be searched:

if((src=cvloadimage(argv[2], 1))== 0)

int patchx = templ->width;

int patchy = templ->height;

int iwidth = src->width - patchx + 1;

int iheight = src->height - patchy + 1;

for(i=0; i<6; ++i)

//do the matching of the template with the image

for(i=0; i<6; ++i)

//display

cvnamedwindow( "template", 0 );

cvshowimage(   "template", templ );

cvnamedwindow( "image", 0 );

cvshowimage(   "image", src );

cvnamedwindow( "sqdiff", 0 );

cvshowimage(   "sqdiff", ftmp[0] );

cvnamedwindow( "sqdiff_normed", 0 );

cvshowimage(   "sqdiff_normed", ftmp[1] );

cvnamedwindow( "ccorr", 0 );

cvshowimage(   "ccorr", ftmp[2] );

cvnamedwindow( "ccorr_normed", 0 );

cvshowimage(   "ccorr_normed", ftmp[3] );

cvnamedwindow( "ccoeff", 0 );

cvshowimage(   "ccoeff", ftmp[4] );

cvnamedwindow( "ccoeff_normed", 0 );

cvshowimage(   "ccoeff_normed", ftmp[5] );

//let user view results:

cvwaitkey(0);

}return 0;

}

OpenCV 學習筆記1

將opencv和vs配置成功後,開始編寫程式。值得說明的是,在opencv中,有以下兩種形式的函式呼叫,一種定義在highgui c.h中,例如 cvnamedwindow test cv window autosize 這種形式的函式呼叫要使用cv作為函式的限定 一種定義在highgui.hpp中...

opencv學習筆記 1

cvloadimage iplimage cvloadimage const char filename,int flags cv load image color filename 要被讀入的檔案的檔名 包括字尾 flags 指定讀入影象的顏色和深度 指定的顏色可以將輸入的轉為3通道 cv loa...

OpenCV學習筆記(1)

記憶力越來越差了,看來寫點東西記錄下來是很有必要的 關於安裝 隨便安,記得最後opencv資料夾在 就好了 關於配置 1.計算機 屬性 環境變數 系統變數中的path 在後面新增 以我的計算機為例 d opencv build x86 vc12 bin d opencv build x64 vc12...