1

오늘 C에서 OpenCV를 사용하여 Hough Transform을 사용하여 원을 검출하는 프로그램을 작성했습니다. 프로그램은 3 개의 이미지를 입력하고 각 이미지에는 고정 된 작은 원이 들어 있으며 가변 위치의 큰 원. 그러면 프로그램에서 두 원을 모두 인식하고 두 원의 중심을 표시합니다. 이제 출력 이미지에서 더 큰 원 중심의 (x, y) 좌표가 고정 된 작은 원의 중심을 기준으로 표시되어야합니다. 다음은 여기에 입력 및 출력 이미지입니다 'circle.cpp'OpenCV를 사용하여 이미지의 다른 점을 좌표를 찾는 방법

#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; 
} 

에 대한 코드는 그리고 :
enter image description hereenter image description hereenter image description here
enter image description hereenter image description hereenter image description here

I가 코드에서 변경할 사항 제안하십시오 원하는 (x, y) 좌표를 표시하십시오. 고맙습니다 :)

+0

당신이하고 싶은 것이 명확하지 않습니다. 큰 원 중심의 X, Y 좌표를 표시 하시겠습니까? 그게 다야? – karlphillip

+0

예, 큰 원 w.r.t의 중심 좌표 (x, y)를 표시하고 싶습니다. 출력 이미지에서 원점 (0,0)으로 취한 작은 원의 중심 – silentassasin

답변

3

이미지를 표시하기 전에 cvPutText을 사용하여 원하는 텍스트를 추가하십시오. 이 함수의 매개 변수는 자체 설명합니다. 글꼴은 cvInitFont을 사용하여 초기화해야합니다.

당신은 상대 좌표를 계산하면, OpenCV의에서, 당신이 축이 지적하는 시스템에 상대 좌표를 보여주는에 관심이 시스템이 단지의 경우이

-----> x 
| 
| 
v 
y 

같은 좌표 것을 명심 다른 방향으로.

Hough 트랜스 폼이 정확히 두 개의 원을 감지했는지 확인해야합니다. 그렇다면 필요한 모든 데이터는 circles 변수에 있습니다. (xa, ya)가 큰 원의 좌표이고 (xb, yb) 작은 좌표의 좌표 인 경우 상대 좌표는 (xa-xb, ya-yb)입니다.

+0

답장은 있지만 'cvPutText'를 사용하여 원하는 텍스트를 표시하기 전의 고안 두 센터의 좌표를 찾는 방법은 무엇입니까? 이 작업을 수행 ? – silentassasin

+0

내 답변에 추가 한 단락을 참조하십시오. –

+0

귀중한 '힌트'에 대한 고맙습니다. 대답으로 표시했습니다. – silentassasin