Как найти координаты точки по сравнению с другой точкой на изображении с помощью OpenCV

#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-> всего должно быть количество обнаруженных кругов.