Я хочу обнаружить круги на изображении, используя 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.
Если бы кто-то мог дать мне предложение о том, что это может быть или, возможно, попробовать запустить алгоритм, я был бы очень благодарен!
У меня есть четыре совета для вас.
Первый: Чтобы увидеть, является ли 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, так что они автоматически позаботятся о выпуске.
Я не вижу ничего очевидного, кроме того, что вы обгоняете 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();
Они автоматически обрабатываются деструктором объекта, поэтому я не понимаю, почему вам нужно делать это вручную. Конечно, это ничего не может изменить.
С этого момента, если вы все еще получаете сбои, вы должны начать пропускать разделы своего кода, пока не сможете изолировать тот, который его вызывает.
Я начал испытывать подозрения по поводу среды, поэтому у меня появился друг, у которого был настроен OpenCV, чтобы опробовать мой код, и он мог запустить его без проблем …
Поэтому я переустановил все, но на этот раз я выбрал Microsoft Visual Studio 2010 SP1 и OpenCV 2.4.3, и он работал правильно.
Если у кого-то возникла такая же проблема, я рекомендую понизиться до VS2010. Также, это видео руководство по установке было действительно полезно, когда я настраивал обстановку!
Спасибо 🙂
У меня была такая же проблема. Пожалуйста, убедитесь, что во время работы вашего приложения в режиме релиза вы используете OpenCV Release DLL. Это решило мою проблему.