如何使用OpenCV在图像上的另一个点上找到点的坐标 [英] How to find the coordinates of a point w.r.t another point on an image using OpenCV

查看:1705
本文介绍了如何使用OpenCV在图像上的另一个点上找到点的坐标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

今天我在C中使用OpenCV编写了一个使用Hough变换检测圆的程序。
程序输入3个图像,每个图像包含一个固定的小圆和一个可变位置的大圆。然后程序识别两个圆圈并标记两个圆圈的中心。现在我想做的是在输出图像中,应该相对于固定的较小圆的中心显示较大圆的中心的(x,y)坐标。以下是'circle.cpp'的代码。

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'

#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:

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

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

推荐答案

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

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.

计算相对坐标时,请记住在OpenCV中,坐标系是这样的

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

-----> 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.

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

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).

这篇关于如何使用OpenCV在图像上的另一个点上找到点的坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆