#image-processing #opencv #image-recognition #hough-transform
#обработка изображений #opencv #распознавание изображений #хаф-преобразование
Вопрос:
Сегодня я написал программу для определения окружностей с помощью преобразования Хафа, используя OpenCV на C. Программа вводит 3 изображения, каждое изображение содержит фиксированный маленький круг и большой круг с переменным положением. Затем программа распознает обе окружности и отмечает центры обеих окружностей. Теперь я хочу сделать так, чтобы на выходном изображении координаты (x, y) центра большего круга отображались относительно центра фиксированного меньшего круга. Вот код для ‘circle.cpp ‘
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
IplImage* img;
int n=3;
char input[21],output[21];
for(int l=1;l<=n;l )
{
sprintf(input,"Frame%d.jpg",l); // Inputs Images
if( (img=cvLoadImage(input))!= 0)
{
IplImage* gray = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
IplImage* canny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
IplImage* rgbcanny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
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
cvCanny(gray,canny,50,100,3);
CvSeq* circles = cvHoughCircles( canny, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
int i;
cvCvtColor(canny,rgbcanny,CV_GRAY2BGR);
for( i = 0; i < circles->total; i )
{
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( rgbcanny, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( rgbcanny, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
cvNamedWindow( "circles", 1 );
cvShowImage( "circles", rgbcanny );
//Displays Output images
sprintf(output,"circle%d.jpg",l);
cvSaveImage(output,rgbcanny);
cvWaitKey(0);
}
}
return 0;
}
И вот входные и выходные изображения:
Пожалуйста, подскажите, какие изменения мне следует внести в код, чтобы отобразить желаемые координаты (x, y). Большое спасибо 🙂
Комментарии:
1. Не ясно, что вы хотите сделать. Вы хотите отобразить координаты X, Y центра больших окружностей? Это все?
2. Да, я хочу отобразить координаты (x, y) центра большого круга по аналогии с центром малого круга, взятым за начало координат (0,0) на выходном изображении
Ответ №1:
Прежде чем показывать изображение, используйте cvPutText для добавления нужного текста. Параметры этой функции объясняются сами собой. Шрифт должен быть инициализирован с помощью cvInitFont.
При вычислении относительных координат имейте в виду, что в OpenCV система координат выглядит следующим образом
-----> x
|
|
v
y
на всякий случай, если вам интересно показать относительные координаты в системе, в которой оси указывают в другом направлении.
Вы должны проверить, что преобразование Хафа обнаружило ровно две окружности. Если это так, все необходимые данные находятся в circles
переменной. Если (xa,ya) — координаты большего круга, а (xb, yb) — координаты меньшего, то относительными координатами будут (xa-xb,ya-yb).
Комментарии:
1. Спасибо за ответ, но перед отображением нужного текста с помощью ‘cvPutText’ как я могу найти координаты обоих центров, какую функцию я должен использовать для этого?
2. Смотрите абзац, который я добавил к своему ответу.
3. Большое спасибо, приятель, за бесценные «подсказки», отмеченные как ответ 🙂
4. но есть идеи, как мне определить, что распознаны только 2 круга?
5. circles-> всего должно быть количество обнаруженных кругов.