2013-06-22 43 views
7

Tôi muốn tạo phần tử cấu trúc đĩa có hình dạng trên OpenCv. Tôi cần SE của tôi là tương tự vớiPhần cấu trúc đĩa opencv vs Matlab

sel = strel('disk',5); 

Tôi muốn làm điều này bằng

cvstructuringElementEx(cols,rows,anchor_x,anchor_y,shape,*values); 

gì tôi cần phải làm gì để đạt được điều này và những giá trị của anchor_xanchor_y cung cấp cho các điểm trung tâm cùng SE với MATLAB?

Trả lời

5

Theo the docs, bạn có thể thử:

cv::Mat sel = cv::getStructuringElement(MORPH_ELLIPSE, cv::Size(9,9)); 

này đã cho tôi các yếu tố cấu trúc sau:

0 0 0 0 1 0 0 0 0 
0 1 1 1 1 1 1 1 0 
0 1 1 1 1 1 1 1 0 
1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 
0 1 1 1 1 1 1 1 0 
0 1 1 1 1 1 1 1 0 
0 0 0 0 1 0 0 0 0 

Trong thời gian ở MATLAB tôi nhận:

>> getnhood(strel('disk',5)) 
ans = 
    0  0  1  1  1  1  1  0  0 
    0  1  1  1  1  1  1  1  0 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    1  1  1  1  1  1  1  1  1 
    0  1  1  1  1  1  1  1  0 
    0  0  1  1  1  1  1  0  0 

Vì vậy, không chính xác giống nhau nhưng đủ gần :)

1

Tôi cần các yếu tố cấu trúc chính xác như trong MATLAB, vì vậy tôi đã viết chức năng này (không phải rất thanh lịch) cho nhu cầu của tôi. Nó hoạt động cho các hình dạng với một số lẻ các hàng/cột giữa 3 và 21 (bạn có thể tự thêm các giá trị khác (đánh dấu # zeros trong Matlab)

Chức năng được gọi như thế này:.

int Radius = 1; 
// following call equivalent to Matlab's sel = getnhood(strel('disk',Radius)) 
cv::Mat sel = strelDisk(Radius); 

Và chức năng thực tế là

cv::Mat strelDisk(int Radius){ 
// THIS RETURNS STREL('DISK',RADIUS) LIKE IN MATLAB FOR RADIUS = ODD NUMBER BETWEEN 3-->21 
cv::Mat sel((2*Radius-1),(2*Radius-1),CV_8U,cv::Scalar(255)); 
int borderWidth; 
switch (Radius){ 
case 1: borderWidth = 0; break; 
case 3: borderWidth = 0; break; 
case 5: borderWidth = 2; break; 
case 7: borderWidth = 2; break; 
case 9: borderWidth = 4; break; 
case 11: borderWidth = 6; break; 
case 13: borderWidth = 6; break; 
case 15: borderWidth = 8; break; 
case 17: borderWidth = 8; break; 
case 19: borderWidth = 10; break; 
case 21: borderWidth = 10; break; 
} 
for (int i=0; i<borderWidth; i++){ 
    for (int j=0; j<borderWidth; j++){ 
     if (i+j<8){ 
      sel.at<uchar>(i,j)=0; 
      sel.at<uchar>(i,sel.cols-1-j)=0; 
      sel.at<uchar>(sel.rows-1-i,j)=0; 
      sel.at<uchar>(sel.rows-1-i,sel.cols-1-j)=0; 
     } 
    } 
} 
return sel; 
Các vấn đề liên quan