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

Сегодня я написал программу для обнаружения кругов с использованием Hough Transform с использованием 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) координаты. Большое спасибо :)


person silentassasin    schedule 26.04.2011    source источник
comment
Непонятно, что вы хотите сделать. Вы хотите отобразить координаты X, Y центра больших кругов? В том, что все?   -  person karlphillip    schedule 27.04.2011
comment
Да, я хочу отобразить координаты (x, y) центра большого круга w.r.t. центр маленького круга, взятый за начало координат (0,0) на выходном изображении   -  person silentassasin    schedule 27.04.2011


Ответы (1)


Прежде чем показывать изображение, используйте cvPutText, чтобы добавить нужный текст. Параметры этой функции говорят сами за себя. Шрифт следует инициализировать с помощью cvInitFont.

Когда вы вычисляете относительные координаты, имейте в виду, что в OpenCV система координат такая

-----> x
|
|
v
y

на всякий случай, если вы хотите показать относительные координаты в системе, в которой оси указывают в другом направлении.

Вы должны проверить, что преобразование Хафа обнаружило ровно два круга. Если да, то все необходимые данные находятся в переменной circles. Если (xa,ya) — координаты большего круга, а (xb,yb) — координаты меньшего, относительные координаты равны (xa-xb,ya-yb).

person Jong Bor Lee    schedule 27.04.2011
comment
Спасибо за ответ, но прежде чем отображать нужный текст с помощью «cvPutText», как я могу найти координаты обоих центров, какую функцию я должен использовать для этого? - person silentassasin; 27.04.2011
comment
См. абзац, который я добавил к своему ответу. - person Jong Bor Lee; 27.04.2011
comment
Большое спасибо, приятель, за бесценные «подсказки», отмеченные как ответ :) - person silentassasin; 27.04.2011
comment
но есть идеи, как мне определить, что распознаны только 2 круга? - person silentassasin; 27.04.2011
comment
круги-›всего должно быть количество обнаруженных кругов. - person Jong Bor Lee; 28.04.2011