7

OpenCv에서 디스크 모양의 구조 요소를 만들고 싶습니다. 내가 사용하여이 작업을 수행 할 수 내 SE는디스크 구조 요소 opencv 대 Matlab

sel = strel('disk',5); 

와 비슷해야하므로 나는 동일한 중심점을 줄이를 달성하기 위해 수행해야하고 anchor_xanchor_y의 가치있는 일을

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

SE와 MATLAB?

답변

5

the docs에 따르면, 당신은 시도 할 수 : MATLAB에서 내가 가진 반면

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 

를 그래서 정확히

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

이 나에게 다음과 같은 구조 요소를 준 동일하지만 충분히 가까이 :)

1

필자는 matlab에서와 같이 정확한 구조 요소가 필요하므로 필자는 필자의 필요에 따라이 함수를 작성했다. 그것은 당신이 수동으로 다른 값을 추가 할 수 3 21 (사이의 행/열 홀수와 모양 작동 ()는 매트랩 # 0을 확인

을 함수는 다음과 같이 호출됩니다.

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

실제 기능은

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; 
입니다.