Задача связана с поиском радужной оболонки. Был вот такой вот код на С:
int main(int argc, char** argv)
{
IplImage* img;
if( argc == 2 && (img=cvLoadImage(argv[1], 1))!= 0)
{
IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor( img, gray, CV_BGR2GRAY );
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smooth it, otherwise a lot of false circles may be detected
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
int i;
for( i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
cvNamedWindow( "circles", 1 );
cvShowImage( "circles", img );
}
return 0;
}
Я его переделал на Делфу:
procedure TForm1.Button2Click(Sender: TObject);
var img, gray: PIplImage;
storage : PCvMemStorage;
circles : PCvSeq;
s : CvSize;
i : integer;
r : PCVRect;
begin
img := cvLoadImage(pchar(OpenPictureDialog1.FileName),1);
s.width := img.width;
s.height := img.height;
gray := cvCreateImage(s,8,1);
storage := cvCreateMemStorage(0);
cvCvtColor(PCvArr(img),PCvArr(gray),CV_BGR2GRAY);
cvSmooth(PCvArr(gray),PCvArr(gray),CV_GAUSSIAN,9,9,0,0);
circles := cvHoughCircles(PCvArr(gray),storage,CV_HOUGH_GRADIENT,2,gray.height/4,200,100,0,0);
for i:=0 to circles.total do
begin
r := PCvRect(cvGetSeqElem(circles,i));
Image1.Canvas.Brush.Color := clRed;
Image1.Canvas.Ellipse(r.x,r.y,r.x+r.width,r.y+r.height);
end;
end;
Как видите, я вместо cvCircle писал CvRect. Оно то что-то считает, но как Вы понимаете не то, есть ли какая-то алтернатива вот этому кусочку кода на Делфи:
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
Мне нужно просто вытянуть координаты кругов: