Распознавать небольшие объекты с помощью OpenCV - PullRequest
0 голосов
/ 30 мая 2019

Я хотел бы иметь возможность распознавать положение (центр) и угол некоторых небольших компонентов с openCV с C #.Чтобы добиться этого, я беру фотографии с веб-камеры и пытаюсь обработать их с помощью алгоритма Канни.К сожалению, результаты не так хороши, как ожидалось.Иногда это нормально, иногда это не так.

Я приложил пример изображения с камеры и соответствующий вывод OpenCV.

Я надеюсь, что кто-то может дать мне подсказки или, возможно, некоторые фрагменты кода, как достичь желаемых результатов.Это то, что обычно делается с ИИ?

Примеры изображений:

Вход:

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 голосов
/ 31 мая 2019

Если у вас уже есть ROI (блок), и вы просто хотите вычислить его фактическую ориентацию, вы можете использовать контур внутри правого блока и вычислить его моменты.Учебное пособие о том, как это сделать, здесь (извините, только C ++).

Если у вас есть моменты, вы можете легко вычислить ориентацию.Для этого следуйте решению здесь .

Если у вас возникли проблемы с определением правильной коробки, вы на самом деле на полпути с хитрыми коробками.Затем вы можете попробовать:

Выровнять исходное изображение:

equalize

Постеризовать следующее (до 2 уровней):

Posterize

Порог (255):

Threshold

Тогда вы можете использовать все коробки CannyВы нашли в центре и используете их как маски, чтобы получить правильный контур в пороговом изображении.Затем вы можете найти самый большой контур здесь и вычислить его ориентацию с моментами изображения.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...