7

मैं OpenCV पर एक डिस्क के आकार का संरचना तत्व बनाना चाहते हैं। मैं अपने एसईडिस्क संरचना तत्व opencv बनाम मैटलैब

sel = strel('disk',5); 

के साथ इसी तरह की जरूरत है मैं का उपयोग कर ऐसा करना चाहते हैं

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

क्या मैं इस लक्ष्य को हासिल करने के लिए क्या करने की जरूरत है और जो anchor_x और anchor_y के मूल्यों का एक ही केंद्र बिंदु देते हैं MATLAB के साथ एसई?

उत्तर

5

the docs के अनुसार, आप की कोशिश कर सकते:

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

यह मैं निम्नलिखित संरचना तत्व दिया:

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 

जबकि MATLAB में मुझे मिल गया:

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

तो बिल्कुल नहीं एक ही लेकिन इतने पास :)

1

मैं matlab में के रूप में सटीक संरचना तत्व की जरूरत है, इसलिए मैं अपने जरूरत के लिए यह (बहुत ही सुंदर नहीं) समारोह में लिखा था। यह आप मैन्युअल रूप से अन्य मूल्यों जोड़ सकते हैं 3 और 21 (के बीच पंक्तियों/स्तंभों की एक विषम संख्या के साथ आकार के लिए काम करता है (मैटलैब में # शून्य जांच)

समारोह इस तरह शुरू हो जाती है।

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; 
है
संबंधित मुद्दे