逐步積累openCV基本操作

2021-06-13 02:45:16 字數 4418 閱讀 9468

1,opencv中的roi介紹

roi(region of interest)是指影象中的乙個矩形區域,可能你後續的程式需要單獨處理這乙個小區域,如圖所示

如上圖所示,就是roi的乙個例子,如果你對影象設定了roi,那麼,opencv的大多數函式只在該roi區域內運算(只處理該roi區域),如果沒設roi的話,就會出來整幅影象。

roi非常有用,例如我們想把影象中的人臉扣出來,進行人臉識別。需要注意的時候,roi一定在影象內部,而不能超出影象的範圍。

對影象設定roi的函式是:

cvsetimageroi(iplimage* src,cvrect rect);

src表示的是源影象,rect只的是roi區域。

如果要取消roi區域,那麼使用函式:

cvresetimageroi(iplimage* src);

這個函式,就把src上的roi區域取消掉。

下面舉幾個例子:

例子1:

從一幅大影象中,取出一小塊影象並儲存這乙個小塊影象。

**如下:

/* 讀取大影象 */

/* 設定影象的roi區域

注意roi區域不要越界,必須在大影象的內部 */

cvsetimageroi(img1, cvrect(10, 15, 150, 250));

/* 為小影象分配記憶體空間

cvgetsize(img1)返回的是乙個cvsize結構體,意思就是返回了影象img1的寬度和高度,由於

img已經設定了roi,所以cvgetsize函式對roi區域有效,所以,返回的是roi區域的寬度和高度 */

iplimage *img2 = cvcreateimage(cvgetsize(img1),

img1->depth,

img1->nchannels);

/* 把img1的roi區域拷貝到img2*/

cvcopy(img1, img2, null);

/* 取消img1上的roi區域 */

cvresetimageroi(img1);

例子2:

兩幅不同大小的影象相加

/* 載入影象

注意,這兩幅影象有不同的寬度和高度 */

iplimage *img1 = cvloadimage("elvita.jpg", 1);  /* 大影象  */

iplimage *img2 = cvloadimage("fifi.jpg", 1);    /* 較小的影象*/

/* 定義roi區域的座標*/

cvrect rect = cvrect(25, 25, img2->width, img2->height);

/* 對影象img1設定roi1區域 */

cvsetimageroi(img1, rect);

/* 兩幅影象相加

注意,通過對img1設定roi區域後,兩幅影象,其實有相同的寬度和高度了。 */

cvadd(img1, img2, img1, null);

/* 取消感興趣區域,即roi區域*/

cvresetimageroi(img1);

例子3:在乙個特定區域進行模板匹配 (

//設定roi區域

cvsetimageroi(src, rect);

iplimage *result = cvcreateimage(cvsize(rect.width  - tpl->width  + 1,

rect.height - tpl->height + 1),

ipl_depth_32f, 1);

/* 進行模板匹配 */

cvmatchtemplate(src, template, result, cv_tm_sqdiff);

/* 查詢最匹配的座標 */

cvpoint    minlocation, maxlocation;

double    minvalue, maxvalue;

cvminmaxloc(result, &minvalue, &maxvalue, &minlocation, &maxlocation, 0);

/* 在源影象上畫出矩形*/

cvrectangle(src,

cvpoint(minlocation.x, minlocationc.y),

cvpoint(minlocation.x + template->width, minlocationc.y + template->height),

cv_rgb(255, 0, 0), 1, 0, 0 );

cvresetimageroi(src);

在上面的例子中,先定義roi區域,再進行模板匹配,這樣會加快匹配的速度,因為,只在roi區域進行模板匹配運算。

例子4:roi區域畫素值的訪問

可以想把roi區域拷貝到一幅新的影象中,然後再訪問其畫素值

/* 假設已經有了一幅 8-bit 3通道影象*/

/* roi的座標*/

cvrect rect = cvrect(10, 20, 50, 60);

/* roi區域的子影象 */

iplimage* subimg;

/* 設定roi區域 */

cvsetimageroi(img, rect);

//roi區域拷貝

cvcopy(img, subimg, null);

//釋放roi區域

cvresetimageroi(img);

/* 然後,就可以對subimg進行訪問,其實就是訪問roi區域 */

或者可以通過roi的左邊資訊進行訪問

/* roi區域的座標 */

cvrect rect = cvrect(10, 20, 50, 60);

//設定roi區域

cvsetimageroi(img, rect);

/* 假設,把整個roi區域賦值為0 */

for (i = rect.y; i < (rect.y + rect.height); i++) }

2011-03-27 22:49:17

|  分類:

opencv|字型大小

訂閱

cvmat* cvgetsubrect(const cvarr* arr, cvmat* submat, cvrect rect)可以把擷取影象中需要的區域存入矩陣。把iplimage *傳給arr,iplimage *指向所要擷取的影象;把cvmat *傳給submat(cvmat *只需為頭指標就可以

不需要分配資料儲存空間);rect是要擷取的區域;返回指向所存矩陣。

例如:cvmat *pmat = cvcreatematheader(100, 100, cv_8uc1);  //建立乙個100*100的矩陣頭

cvrect rect = cvrect(0, 0, 100, 100);  //要擷取的區域,與建立的矩陣大小一樣

cvgetsubrect(pimg, pmat, rect);  //pimg為指向影象的指標,pmat指向儲存所接影象的矩陣,返回值和pmat相等

也可以簡化為:

cvmat *pmat = cvgetsubrect(pimg, cvcreatematheader(100, 100, cv_8uc1), cvrect(0, 0, 100, 100));

iplimage* cvgetimage( const cvarr* arr, iplimage* image_header )可以把剛才存入矩陣的資料轉存為影象。把cvmat *傳給arr;image_header

只需為影象頭就行,不用分配資料儲存空間 ;返回所存影象的指標。

例如:iplimage *psubimg = cvcreateimageheader(cvsize(100, 100), 8, 1);  //建立乙個100*100的影象頭

cvgetimage(pmat, psubimg); //pmat為儲存資料的矩陣,psubimg指向影象,返回值與psubimg相等

也可以簡化為:

iplimage *psubimg = cvgetimage(pmat, cvcreateimageheader(cvsize(100, 100), 8, 1));

擷取子圖最後簡化為:

iplimage *psubimg = cvgetimage(cvgetsubrect(pimg, cvcreatematheader(100, 100, cv_8uc1), cvrect(0, 0, 100, 100)), cvcreateimageheader(cvsize(100, 100), 8, 1));  //好亂...讀明白這句費勁兒

linux基本操作積累

1 ls all 列出當前目錄所有檔案包含隱藏檔案和隱藏目錄 第一列表示檔案的屬性 第二列表示硬鏈結數 第三列和第四列是所屬使用者和組 第五列是大小 第六列修改時間 第七列 檔名 2 檢視檔案使用情況 df h df t 3 root localhost 和 root localhost 區別 ro...

openCV的基本操作 一

import cv2 用cv2開啟檔案 path dress.jpeg im cv2.imread path 設定視窗格式 cv2.namedwindow dress 0 顯示視窗,根據視窗名追蹤視窗 cv2.imshow dress im 等待輸入 cv2.waitkey 摧毀所有視窗 如果太大,...

opencv的Mat類基本操作

官方對mat介紹的原話 the class mat represents an n dimensional dense numerical single channel or multi channel array.it can be used to store real or complex va...