影象感興趣區域(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...