Здравствуйте!
Имееться веб-камера, которая следит за движением круга. Камера делает джпег картинки и, сравнивая центр круга на картинках, выводит сообщение в какую сторону движеться круг.
Прога работает, но очень часто выбивает "Segmentation fault". Дебаггал через gdb - невожможно считать с p[0] и p[1]. Чуть-чуть проекспереминтивовав, случалось, когда сменить освещение круга и камеры, то прога работала нормально. Но в проге добавил ещё цикл "раскачки камеры" - тоесть сперва камера работает вхолостую, а потом сохраняем кадры.
В чём может быть проблема - в камере или нужно сменить метод распознавания круга?
Пробовал распознать круги простой прогой распознавания с книги, но джпеги делал стандартной Линуксовской программой Cheese - распознаються нормально, но если вручную делать джпеги с помощью OpenCV, то очень часто та же ошибка - "Segmentation fault", невожможно считать с p[0] и p[1].
#include "cv.h"
#include "highgui.h"
#include <math.h>
#include <stdio.h>
int main(int argc, char** argv)
{
CvCapture* capture = cvCaptureFromCAM( 0 );
if (capture==NULL) printf("error capturing from camera\n");
assert( capture );
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 352);//1280);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 288);//960);
cvWaitKey(100);
IplImage* frame=0;
char filename[512];
for (int i=0; i<30; i++)
{
frame = cvQueryFrame( capture ); // "раскачка" камеры
cvWaitKey(1);
}
float previous[3]; // array for previous circle coordinates - x,y,r
previous[0]=0;
previous[1]=0;
for (int cycle=1; cycle<30 ;cycle++ )
{
frame = cvQueryFrame( capture );
sprintf(filename, "Image%d.jpg", cycle);
cvSaveImage(filename, frame);
cvWaitKey(100);
IplImage* image = cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE);
IplImage* src = cvLoadImage(filename);
CvMemStorage* storage = cvCreateMemStorage(0);
cvSmooth(image, image, CV_GAUSSIAN, 5, 5 );
CvSeq* results = cvHoughCircles(image, storage, CV_HOUGH_GRADIENT, 2, image->width/10);
float* p = (float*) cvGetSeqElem( results, 1 );
if ((previous[0]<p[0]) && (previous[1]<p[1]))
printf(" right --->>> down\n");
if (previous[0]<p[0] && previous[1]>p[1])
printf(" right --->>> up\n");
if (previous[0]>p[0] && previous[1]>p[1])
printf(" left <<<--- up\n");
if (previous[0]>p[0] && previous[1]<p[1])
printf(" left <<<--- down\n");
if (previous[0]==p[0] && previous[1]<p[1])
printf(" right --->>>\n");
if (previous[0]<p[0] && previous[1]==p[1])
printf(" up\n");
if (previous[0]==p[0] && previous[1]>p[1])
printf(" left <<<--- \n");
if (previous[0]>p[0] && previous[1]==p[1])
printf(" down\n");
if (previous[0]==p[0] && previous[1]==p[1])
printf(" stable\n");
previous[0]=p[0];
previous[1]=p[1];
}
cvReleaseCapture( &capture );
return 0;
}