2013-06-22 13 views
7

OpenCv'de disk şeklinde bir yapılandırma öğesi oluşturmak istiyorum. Ben kullanarak bunu yapmak istiyor benim SEDisk Yapılandırma Öğesi ve Matlab

sel = strel('disk',5); 

ile benzer olması gerekiyor ben aynı merkez noktasını vermek Bunu başarmak için yapmanız gereken ve anchor_x ve anchor_y ait hangi değerlerin ne yapıyoruz

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

MATLAB ile SE?

cevap

5

the docs göre, deneyebilirsiniz: MATLAB'ta ben var iken

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 

:

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

Yani tam

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

Bu bana şu yapılanma elemanı verdi aynı ama yeterince yakın :)

1

Matlabdaki gibi tam yapılandırma elemanına ihtiyacım vardı, bu yüzden ihtiyacım için bunu (çok zarif değil) yazdım. Bu el diğer değerleri ekleyebilir 3 ve 21 arasında (satır/sütun tek sayıda şekiller için çalışır () Matlab # sıfırları kontrol

işlevi aşağıdaki gibi çağrılır.

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

Ve asıl işlev

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;