OpenCV — HoughCircles, вызывающий сбой программы

Я хочу обнаружить круги на изображении, используя OpenCV и C ++. Я мог бы сделать это, обращаясь к официальная документация и корректировка параметров фрагмента кода, написанного командой OpenCV.

Итак, код, с которым я работаю, выглядит следующим образом: (параметры уже настроены)

    #include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>
#include <stdio.h>

using namespace cv;

int main(int, char** argv)
{
Mat src, src_gray;

/// Read the image
src = imread( argv[1], 1 );

if( !src.data )
{ return -1; }

/// Convert it to gray
cvtColor( src, src_gray, CV_BGR2GRAY );

/// Reduce the noise so we avoid false circle detection
GaussianBlur( src_gray, src_gray, Size(9, 9), 2, 2 );

vector<Vec3f> circles;

/// Apply the Hough Transform to find the circles
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 6.0, 5, 110, 70, 3, 20 );

/// Draw the circles detected
for( size_t i = 0; i < circles.size(); i++ )
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][2]));
int radius = cvRound(circles[i][3]);
// circle center
circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
// circle outline
circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );
}

/// Show your results
namedWindow( "Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE );
imshow( "Hough Circle Transform Demo", src );

waitKey(0);

src.release();
src_gray.release();

return 0;
}

И изображение, круги которого я хочу обнаружить, выглядит следующим образом: Тестовое изображение

На самом деле это контур двух блобов, которые я получил с помощью cvBlobsLib и перерисовал как новое изображение.

Этот алгоритм способен идентифицировать центры каждого круга, но когда я нажимаю любую клавишу, чтобы закрыть программу, он падает … 🙁 И я вынужден принудительно закрыть его.

Мне нужно адаптировать этот алгоритм для работы в камере, поэтому я не могу приступить к реализации, пока он так и не падает.

Итак, кто-нибудь знает, что может быть причиной этой проблемы?
Я занимаюсь разработкой для Visual Studio 2012 и OpenCV версии 2.4.2.

Если бы кто-то мог дать мне предложение о том, что это может быть или, возможно, попробовать запустить алгоритм, я был бы очень благодарен!

3

Решение

У меня есть четыре совета для вас.

Первый: Чтобы увидеть, является ли Mat пусто или нет, вы используете

if( src.empty() ) // instead of !src.data.

Скорее всего, src.data имеет случайное (устаревшее) значение для пустого Mat,

Во-вторых: исправьте индексы следующим образом:

Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);

(на самом деле вам не нужен cvRound, но что угодно).

В третьих: Стоит проверить, imread Понял, что вы хотите загрузить изображение в цветном режиме, проверив его количество каналов:

src.channels()==3
//or
src.type()==CV_8UC3; // that is what you are counting for, really.

В противном случае строка типа CV_BGR2GRAY на сером изображении может вызвать странное поведение.

В-четвертых: тебе не нужно выпускать Мата. По этой причине они в первую очередь создали класс Mat, так что они автоматически позаботятся о выпуске.

1

Другие решения

Я не вижу ничего очевидного, кроме того, что вы обгоняете Vec3f оценки:

         Point center(cvRound(circles[i][0]), cvRound(circles[i][2]));
int radius = cvRound(circles[i][3]);

Вместо индексов 2 и 3, я думаю, вы имели в виду 1 и 2.

Это не обязательно будет причиной сбоя (из-за повреждения стека или кучи), но, опять же, это неопределенное поведение …

Другая вещь, которую я предлагаю, это удалить две строки, которые следуют за waitKey вызов:

    src.release();
src_gray.release();

Они автоматически обрабатываются деструктором объекта, поэтому я не понимаю, почему вам нужно делать это вручную. Конечно, это ничего не может изменить.

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

0

Я начал испытывать подозрения по поводу среды, поэтому у меня появился друг, у которого был настроен OpenCV, чтобы опробовать мой код, и он мог запустить его без проблем …

Поэтому я переустановил все, но на этот раз я выбрал Microsoft Visual Studio 2010 SP1 и OpenCV 2.4.3, и он работал правильно.

Если у кого-то возникла такая же проблема, я рекомендую понизиться до VS2010. Также, это видео руководство по установке было действительно полезно, когда я настраивал обстановку!

Спасибо 🙂

0

У меня была такая же проблема. Пожалуйста, убедитесь, что во время работы вашего приложения в режиме релиза вы используете OpenCV Release DLL. Это решило мою проблему.

Ссылка:
https://code.ros.org/trac/opencv/ticket/953

0