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...