CvInvoke.MinAreaRect(轮廓)返回错误的角度

时间:2018-11-12 09:16:23

标签: c# emgucv contour angle

我有一个号码牌的轮廓,我想检查它是否倾斜。我使用了CvInvoke.MinAreaRect(contour),但是即使平板明显倾斜,它也总是返回angle == -90,您可以在下面的图片中看到我绘制的轮廓。

return values

contour draw

original image

有人知道发生了什么事并且解决了我的问题吗?

代码如下:

Image<Gray, byte> gray = new Image<Gray, byte>("2.PNG");
Image<Gray, byte> adaptive_threshold_img = gray.ThresholdAdaptive(new Gray(255), AdaptiveThresholdType.GaussianC, ThresholdType.BinaryInv, 11, new Gray(2));

VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
Mat hier = new Mat();
CvInvoke.FindContours(adaptive_threshold_img, contours, hier, RetrType.Tree, ChainApproxMethod.ChainApproxSimple);

double max_area = 0;
VectorOfPoint max_contour = new VectorOfPoint();

for (int i = 0; i < contours.Size; i++)
{
    double temp = CvInvoke.ContourArea(contours[i]);
    if (temp > max_area)
    {
        max_area = temp;
        max_contour = contours[i];
    }
}

VectorOfVectorOfPoint contour_to_draw = new VectorOfVectorOfPoint(max_contour);
CvInvoke.DrawContours(gray, contour_to_draw, 0, new MCvScalar(255), 2);

CvInvoke.Imshow("plate", gray);

RotatedRect plate_feature = CvInvoke.MinAreaRect(max_contour);

CvInvoke.WaitKey();
CvInvoke.DestroyAllWindows();

1 个答案:

答案 0 :(得分:0)

尝试使用CvInvoke.threshold()而不是gray.ThresholdAdaptive()。设置适当的阈值,您将获得比以前更好的轮廓。