Как улучшить обнаружение объектов?

Я хочу улучшить свой проект, который предназначен для обнаружения объектов.

Во-первых, чтобы получить фактический результат, я использую absdiff, а затем я использую следующие операции в моем коде ниже:

cv::threshold(subtractionResultEdges, threshold, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

    Sobel(threshold, sobel, CV_32F, 1, 0);

    minMaxLoc(sobel, &minVal, &maxVal);

    sobel.convertTo(sobel, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));

    dilate(subtractionResultEdges, subtractionResultEdges, verticalStructreMat, Point(-1, -1));


    erode(subtractionResultEdges, filteredResult, verticalStructreMat, Point(-1, -1));

    Canny(filteredResult, filteredResult, 33, 100, 3);

Моя последняя операция findContours(canny_output, *contours, *hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

Это мой результат после использования каждой функции и переднего плана, который я получаю с помощью функции accumulate (20 кадров):

передний план: http://j71i.imgup.net/foregroundc3dc.PNG

вычитание: http://p81i.imgup.net/subtractio2866.PNG

Собел: http://g51i.imgup.net/sobela1fb.PNG

порог: http://p46i.imgup.net/treshold14c9.PNG

расширять, разрушать и Канни:

http://q68i.imgup.net/canny2e1a.PNG

найтиКонтуры: http://v76i.imgup.net/contours6845.PNG

Фон также получается из функции accumulate.

Не могли бы вы помочь мне улучшить определение углов или контуров? Мне это нужно, чтобы получить размер объекта в пикселях.

Заранее спасибо!


person B.Kosmowski    schedule 08.12.2015    source источник
comment
Не могли бы вы привести пример желаемого обнаружения?   -  person Shreyas Kapur    schedule 08.12.2015
comment
Я хочу обнаружить пакеты. В общем случае объект должен быть прямоугольным. Он может быть не параллелен краю камеры, поэтому я не хочу использовать функцию boundingRect , так как, на мой взгляд, слишком велика ошибка обнаружения.   -  person B.Kosmowski    schedule 09.12.2015
comment
Попробуйте размыть, не используя Canny, а затем найдите контуры, он должен дать ограничивающий прямоугольник, поскольку он просто становится каплей белых пикселей.   -  person Shreyas Kapur    schedule 09.12.2015
comment
Я пытался сделать это, как вы сказали, но результат был хуже, чем раньше. Любые другие идеи?   -  person B.Kosmowski    schedule 09.12.2015
comment
@Shreyas Kapur, это результат: p16i.imgup.net/resultdc78.PNG   -  person B.Kosmowski    schedule 09.12.2015


Ответы (1)


Используйте ядро ​​большего размера для расширения/удаления часть, может быть (11, 11) или даже больше, или же сделать несколько итераций (это можно установить как параметр. Это должно лучше соединять отдельные части вашего обнаруженного объекта, и тогда у вас будет меньше контуров.

Затем для вычисления площади можно использовать contourArea()

person mirosval    schedule 09.12.2015
comment
Я попытался использовать более крупный фильтр расширения и эрозии, и я получил некоторый результат. Не могли бы вы сказать мне, как я могу получить высоту и ширину из contourArea ()? Возможно, используйте другую функцию для этого результата, который я получаю от использования findContours function. - person B.Kosmowski; 09.12.2015
comment
boundingRect Я пробовал это раньше, но у меня это не сработало. - person B.Kosmowski; 09.12.2015
comment
что ты имеешь в виду под не сработало? он вернет ограничивающий прямоугольник контура.. так что, может быть, ваши контуры изначально были плохими? - person mirosval; 09.12.2015
comment
Я имею в виду, что эта функция не может ограничивать прямоугольник моего объекта, потому что я думаю, что контуры не завершены. Они не закрыты. - person B.Kosmowski; 09.12.2015
comment
ааа попробуйте CV_RETR_EXTERNAL или CV_RETR_LIST в поиске контуров, тогда - person mirosval; 09.12.2015
comment
Я пытался использовать CV_RETR_LIST. Это очень хорошо, и вот результат: m00i.imgup.net/resultP9280.PNG. Как видите, края объекта параллельны краю камеры, но boundingRect работает не очень хорошо (см. зеленый прямоугольник). Следующая проблема, посмотрите, что произошло, когда у нас были края объекта в другом положении (под углом) k75i.imgup .net/resultA86c8.PNG. В этом случае ошибка слишком велика. - person B.Kosmowski; 09.12.2015