openCV任意幾何形狀感興趣區域(ROI)提取

2021-08-11 22:12:37 字數 3126 閱讀 3562

影象感興趣區域(roi)提取主要使用掩模來進行。掩模是二值影象,感興趣區域的掩模值設定為255,非感興趣區域的掩模值為0 

獲取掩模的方法主要有兩種

方法一 使用opencv中mat函式方法,呼叫mat(rect).setto方法設定掩模

mat mat::operator()( const rect& roi ) const

//呼叫mat(rect).setto方法

mask(rect).setto(255);

方法二 在全為0的原始掩模中畫乙個封閉區域,使用漫水填充演算法填充封閉區域,將封閉區域的值都設定為255,實現掩模的提取

下文對矩形、橢圓,有方向的矩形,輪廓進行提取

(1)呼叫mat(rect).setto方法設定掩模 

使用方法一對矩形感興趣區域進行提取示例**如下:

#include

#include

using

namespace cv;

//方法1,假如區域為長方形,使用mat 建構函式設定區域內的值為255

int main()

(2)使用漫水填充演算法獲取矩形roi 

思路: 

1)新建乙個值全為零的掩模影象(全是黑的,值為0) 

2)在掩模影象上用白色畫出矩形的邊界(邊界值為255) 

3)選取矩形的中心作為種子點,使用漫水填充演算法將矩形的內部填充為白色(255),最後得到掩模影象,使用掩模實現感興趣區域提取。

#include#includeusing namespace cv;

int main()

任意幾何形狀感興趣區域的提取主要使用方法二。提取的關鍵是畫出幾何形狀的邊界。 

(1)旋轉的矩形(cvbox2d)、橢圓(rotatedrect)、圓的感興趣區域的提取 

示例**如下:

#include

#include

using namespace cv;

#define width 256

#define height 256

void drawbox(cvbox2d box, iplimage* img)

cvboxpoints(box, point); //計算二維盒子頂點

cvpoint pt[4];

for (i = 0

; i<4; i++)

cvline(img, pt[0], pt[1], cvscalar(255), 2, 8, 0);

cvline(img, pt[1], pt[2], cvscalar(255), 2, 8, 0);

cvline(img, pt[2], pt[3], cvscalar(255), 2, 8, 0);

cvline(img, pt[3], pt[0], cvscalar(255), 2, 8, 0);

}//方法3.在掩模影象中畫旋轉的矩形(cvbox2d)、橢圓(rotatedrect)、圓,使用漫水填充演算法將幾何圖形內部的值設定為255

int main()

(2)感興趣區域為輪廓的提取 

思路:1)呼叫opencv的畫圖函式cvline將輪廓中相鄰的點連線為區域 

2)獲取輪廓中心,使用漫水填充演算法填充 

示例**如下:

#include

#include

using namespace cv;

#define width 256

#define height 256

//draw in gray image

void draw_external_contour_gray(cvseq *seq, iplimage* grayimage)

cvpoint* prepoint = (cvpoint*)cvgetseqelem(seq, 0);

cvpoint* lastpoint = (cvpoint*)cvgetseqelem(seq, seq->total - 1);

cvline(grayimage, *prepoint, *lastpoint,cvscalar(255), 1, 8, 0);

for (int i = 1; itotal; i++)

}//方法4,假如區域邊界為輪廓,使用掩模影象中畫輪廓,使用漫水填充演算法將幾何圖形內部的值設定為255

int main()

; cvpoint p2 = ; cvpoint p4 = ; cvpoint p3 = ; cvpoint p5 = ;

cv_write_seq_elem(p1, writer);

cv_write_seq_elem(p2, writer);

cv_write_seq_elem(p3, writer);

cv_write_seq_elem(p4, writer);

cv_write_seq_elem(p5, writer);

cvflushseqwriter(&writer);

cvseq* contour = cvendwriteseq(&writer);

printf("contour.size=%d", contour->total);

iplimage* imask = &iplimage(mask);

iplimage* iimage = &iplimage(image);

draw_external_contour_gray(contour, imask);

point seed;

seed.x = 35;

seed.y = 60;

//漫水填充

//pi的值表示為 v(pi),if v(seed)-lodiff255, null, cvscalarall(0), cvscalarall(0), cv_floodfill_fixed_range);

mat maskimage;

image.copyto(maskimage, mask);

imshow("mask", maskimage);

cvshowimage("imask",imask);

waitkey();

return

0;}

openCV任意幾何形狀感興趣區域(ROI)提取

影象感興趣區域 roi 提取主要使用掩模來進行。掩模是二值影象,感興趣區域的掩模值設定為255,非感興趣區域的掩模值為0 獲取掩模的方法主要有兩種 方法一使用opencv中mat函式方法,呼叫mat rect setto方法設定掩模 mat mat operator const rect roi c...

Opencv感興趣區處理

用roi來增加某範圍的畫素值 include include ch3 ex3 12 image name x y width height add int main iplimage src cvnamedwindow example3 12 pre cv window autosize cvnam...

opencv學習之感興趣區域(ROI)

新手學習就是苦啊,好多東西都要一點點的摸索,之前的經驗太少,積累太少,許多問題太簡單了,問別人都不好開口,誰讓自己太low了啊!那就自己折騰唄 今天看了opencv的矩陣和影象操作部分內容,這裡把這折騰的過程弄上來了 書上給了兩種獲得感興趣矩形區域的方式 乙個是直接用函式 cvsetimageroi...