CvInvoke.MinAreaRect (контур) возвращает неправильный угол - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть контур номерного знака, и я хочу проверить, наклонен он или нет. Я использовал 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 голосов
/ 17 ноября 2018

Попробуйте CvInvoke.threshold() вместо gray.ThresholdAdaptive(). Установите правильный порог, и вы получите лучший контур, чем раньше.

...