使用OpenCV识别小物体

时间:2019-05-30 08:45:03

标签: c# opencv

我希望能够使用带有C#的openCV识别一些小组件的位置(中心)和角度。为此,我从网络摄像头抓取图片,并尝试使用Canny算法对其进行处理。不幸的是,结果不如预期的好。有时还可以,有时则没有。

我已经附加了一个来自凸轮的示例图像以及OpenCV的相应输出。

我希望有人能给我提示或一些代码片段,以实现我所期望的结果。这是AI通常完成​​的事情吗?

示例图片:

输入:

Input image

输出1:

enter image description here

输出2:

enter image description here

预期:

enter image description here

谢谢。

实际代码:

        Mat src;
        src = BitmapConverter.ToMat(lastFrame);
        Mat dst = new Mat();
        Mat dst2 = new Mat();

        Cv2.Canny(src, dst, hScrollBar1.Value, hScrollBar2.Value);

        // Find contours
        OpenCvSharp.Point[][] contours; //vector<vector<Point>> contours;
        HierarchyIndex[] hierarchyIndexes; //vector<Vec4i> hierarchy;

        Cv2.FindContours(dst, out contours, out hierarchyIndexes, RetrievalModes.External, ContourApproximationModes.ApproxTC89L1);

        foreach (OpenCvSharp.Point[] element in contours)
        {
            var biggestContourRect = Cv2.BoundingRect(element);

            Cv2.Rectangle(dst,
                new OpenCvSharp.Point(biggestContourRect.X, biggestContourRect.Y),
                new OpenCvSharp.Point(biggestContourRect.X + biggestContourRect.Width, biggestContourRect.Y + biggestContourRect.Height),
                new Scalar(255, 0, 0), 3);
        }



        using (new Window("dst image", dst)) ;
        using (new Window("src image", src)) ;

1 个答案:

答案 0 :(得分:0)

如果您已经有一个ROI(方框),并且只想计算它的实际方向,则可以使用右侧方框中的轮廓并计算其力矩。有关如何执行此操作的教程是here(仅对不起C ++)。

您一有机会就可以轻松计算方向。为此,请遵循解决方案here

如果您在找出正确的盒子本身时遇到困难,那么实际上您在使用精巧盒子的途中。然后,您可以进一步尝试:

均衡源图像:

equalize

将海报下海报(分为2级):

Posterize

阈值(255):

Threshold

然后,您可以使用在中央找到的所有Canny框,并将它们用作蒙版,以在阈值图像中获得正确的轮廓。然后,您可以在此处找到最大的轮廓,并通过图像力矩计算其方向。希望这会有所帮助!