Image processing 如何使用OpenCV查找图像上一个点与另一个点的坐标

Image processing 如何使用OpenCV查找图像上一个点与另一个点的坐标,image-processing,opencv,image-recognition,hough-transform,Image Processing,Opencv,Image Recognition,Hough Transform,今天,我用C中的OpenCV编写了一个使用Hough变换检测圆的程序。 程序输入3幅图像,每幅图像包含一个固定的小圆和一个位置可变的大圆。然后程序识别两个圆并标记两个圆的中心。现在我想做的是,在输出图像中,大圆中心的(x,y)坐标应该显示为相对于固定小圆中心的坐标。这是“circle.cpp”的代码 #include <cv.h> #include <highgui.h> #include <math.h> int main(int argc, char**

今天,我用C中的OpenCV编写了一个使用Hough变换检测圆的程序。 程序输入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;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
IplImage*img;
int n=3;
字符输入[21],输出[21];
对于(整数l=1;lheight/4200100);
int i;
CVTColor(canny、rgbcanny、CV_GRAY2BGR);
对于(i=0;itotal;i++)
{
float*p=(float*)cvGetSeqElem(圆,i);
cvRound(p[0])、cvRound(p[1])、3、CV_RGB(0255,0),-1,8,0;
cvRound(p[0])、cvRound(p[1])、cvRound(p[2])、cvu RGB(255,0,0)、3,8,0;
}
cvNamedWindow(“圆圈”,1);
cvShowImage(“圆”,RGB注释);
//显示输出图像
sprintf(输出,“圆圈%d.jpg”,l);
cvSaveImage(输出,rgbcanny);
cvWaitKey(0);
}
}
返回0;
}
以下是输入和输出图像:


请建议我应该在代码中进行哪些更改以显示所需的(x,y)坐标。Thanx很多:)

在显示图像之前,使用添加所需的文本。此函数的参数是自解释的。应使用初始化字体

计算相对坐标时,请记住,在OpenCV中,坐标系如下所示

-----> x
|
|
v
y
以防您对显示轴指向另一个方向的系统中的相对坐标感兴趣


您应该检查Hough变换是否正好检测到两个圆。如果是这样,您需要的所有数据都在
圆圈中
变量中。如果(xa,ya)是较大圆的坐标,(xb,yb)是较小圆的坐标,则相对坐标是(xa-xb,ya-yb)。

不清楚要做什么。是否要显示大圆中心的X、Y坐标?就这些吗?是的,我想显示大圆中心的(x,y)坐标w.r.t.小圆中心作为原点(0,0)在输出图像Thanx中用于回复,但在使用“cvPutText”显示所需文本之前,如何找到两个中心的坐标,我应该使用哪个函数来实现这一点?请参阅我在答案中添加的段落。Thanx很多朋友都将其标记为答案:)但是我应该如何检测到只有2个圆圈被识别?圆圈->总数应该是检测到的圆圈数。