Question

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!

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top