Domanda

I have one image like image A, and I wanna detect the main direction which shows in image B. In my code, I detect the edge first, then I try to find the contours. Then I plan to use the moments to get the angle by "angle = 180*atan((2*m11)/(m20 - m02))/(PI*2.0);" But the result is wrong!

enter image description here

// My function
Mat edge_Processing(Mat Input_image,int Para_canny_1,int Para_canny_2)
{
Mat edge;

//blur gray
blur(Input_image, Input_image, Size(3,3));

// Canny edge
Canny(Input_image,edge, Para_canny_1,Para_canny_2 , 3);

//imshow("Before contour",edge);

std::vector<std::vector<cv::Point>> contours;
cv::findContours(edge, 
    contours, // a vector of contours 
    CV_RETR_EXTERNAL, // retrieve the ezxternal contours
    CV_CHAIN_APPROX_NONE); // all pixels of each contours

// Draw black contours on a white image
cv::Mat result(edge.size(),CV_8U,cv::Scalar(0));


std::vector<std::vector<cv::Point>>::
    const_iterator itc= contours.begin();

//Get the moments
vector<Moments> mu(contours.size() );
int moment_count=0;
while (itc!=contours.end())
{
    mu[moment_count] = moments(contours[moment_count], false );

double m11=mu[moment_count].m11;
double m20=mu[moment_count].m20;
double m02=mu[moment_count].m02;

double angle=90;
    // In case of the situation of dividing by 0        
if (abs(m20 - m02)>0.001)
{
angle = 180*atan((2*m11)/(m20 - m02))/(PI*2.0);
}

cout<<angle<<endl; // Here! The angle are wrong!


++itc;
moment_count++;

}
    // Draw the contour
cv::drawContours(result,contours,
    -1, // draw all contours
    cv::Scalar(255), // in black
    1); // with a thickness of 1

//imshow("contour after filtering",result);

return result;
};

Some results are shown here, we can see these components' angle are almost 90. But the results are all wrong. enter image description here Thanks!

È stato utile?

Soluzione

Depending what you want to do, you could also use the RotatedRect.

//you got your contour
RotatedRect minRect = minAreaRect(contour);
minRect.angle //angle from 0-90

Check out this thread, to see how you can compute the correct angle from that.

This is probably only viable if you want to use a RotatedRect anyway and if your contours are close to a rectangle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top