如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。

时间:2022-10-17 21:18:49

Today I wrote a program for detecting circles using Hough Transform using OpenCV in C. The program inputs 3 images, each image contains a fixed small circle and a big circle with variable position. The program then recognizes both the circles and marks the centres of both the circles. Now what I want to do is that in the output image the (x,y) coordinates of the centre of the bigger circle should be displayed with respect to the centre of the fixed smaller circle . Here's the code for 'circle.cpp'

今天我编写了一个程序,用于检测使用OpenCV在c语言中使用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;
}

And here are the input and output images:
如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。
如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。如何找到点的坐标。在使用OpenCV的图像上,不要使用另一个点。

这里是输入和输出图像:

Please suggest what changes should I make in the code to display the desired (x,y)coordinates. Thanx a lot :)

请建议我在代码中应该做些什么改变来显示所需的(x,y)坐标。谢谢很多:)

1 个解决方案

#1


3  

Before you show the image, use cvPutText to add the desired text. The parameters of this function are self-explaining. The font should be initialized using cvInitFont.

在显示图像之前,请使用cvPutText添加所需的文本。这个函数的参数是自我解释的。字体应该使用cvInitFont初始化。

When you calculate the relative coordinates, keep in mind that in OpenCV, the coordinate system is like this

当你计算相对坐标时,记住在OpenCV中,坐标系统是这样的。

-----> x
|
|
v
y

just in case you are interested in showing the relative coordinates in a system in which the axes point in another direction.

如果你感兴趣的是在一个坐标系中显示坐标轴指向另一个方向的坐标。

You should check that the Hough transform has detected exactly two circles. If so, all the data you need is in the circles variable. If (xa,ya) are the coordinates of the bigger circle and (xb,yb) the coordinates of the smaller one, the relative coordinates are (xa-xb,ya-yb).

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

#1


3  

Before you show the image, use cvPutText to add the desired text. The parameters of this function are self-explaining. The font should be initialized using cvInitFont.

在显示图像之前,请使用cvPutText添加所需的文本。这个函数的参数是自我解释的。字体应该使用cvInitFont初始化。

When you calculate the relative coordinates, keep in mind that in OpenCV, the coordinate system is like this

当你计算相对坐标时,记住在OpenCV中,坐标系统是这样的。

-----> x
|
|
v
y

just in case you are interested in showing the relative coordinates in a system in which the axes point in another direction.

如果你感兴趣的是在一个坐标系中显示坐标轴指向另一个方向的坐标。

You should check that the Hough transform has detected exactly two circles. If so, all the data you need is in the circles variable. If (xa,ya) are the coordinates of the bigger circle and (xb,yb) the coordinates of the smaller one, the relative coordinates are (xa-xb,ya-yb).

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