Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OpenCV中通过三次鼠标单击绘制圆?_C++_Opencv_Draw - Fatal编程技术网

C++ 如何在OpenCV中通过三次鼠标单击绘制圆?

C++ 如何在OpenCV中通过三次鼠标单击绘制圆?,c++,opencv,draw,C++,Opencv,Draw,我想在一张图片上画一个圆圈,点击鼠标3下。 我的意思是,我有一个图像,当我在这个图像上点击3次,圆圈就画出来了。此外,我已经有代码,以找到给定3点圆的参数 Mat cember_denklemi(Point2f A,Point2f B,Point2f C) { double W[3][3]={{A.x,A.y,1}, {B.x,B.y,1}, {C.x,C.y,1}}; double T[3][1]

我想在一张图片上画一个圆圈,点击鼠标3下。 我的意思是,我有一个图像,当我在这个图像上点击3次,圆圈就画出来了。此外,我已经有代码,以找到给定3点圆的参数

Mat cember_denklemi(Point2f A,Point2f B,Point2f C) {
    double W[3][3]={{A.x,A.y,1},
                    {B.x,B.y,1},
                    {C.x,C.y,1}};

    double T[3][1]={-(A.x*A.x+A.y*A.y),
                    -(B.x*B.x+B.y*B.y),
                    -(C.x*C.x+C.y*C.y)};
    Mat M=Mat(3,3,CV_64F,W);
    Mat N=Mat(3,1,CV_64F,T);
    Mat L=M.inv()*N;

    return L;
}
这是我的主要观点:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#include <iostream>
using namespace std;
using namespace cv;

void mouseKordinat(int evt, int x, int y, int flags, void* ptr);
void getPixelValue(Mat img, int x, int y);
Mat image;

int main() {
    image = imread("c:/opencv2.4.6./atlas15.jpg");
    imshow("MyWindow", image);
    setMouseCallback("MyWindow", mouseKordinat, 0 );
    waitKey(0);
    return 0;
}

void mouseKordinat(int evt, int c, int r, int flags, void* ptr) {
    if(evt==CV_EVENT_LBUTTONDOWN) {
        getPixelValue(image,r,c);
    }
} 
void getPixelValue(Mat img, int r, int c) {
    Vec3b pix=img.at<Vec3b>(r,c);
    int B = pix.val[0];
    int G = pix.val[1];
    int R = pix.val[2];
    cout<<"Row:"<<r<<" "<<"Column:"<<c<<" - "; // mouse kordinatlari
    cout<<"B:"<<B<<" "<<"G:"<<G<<" "<<"R:"<<R<<"\n"; // kordinatın pixel değerleri
}

我不能结合这些密码;但我已经做到了

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#include <iostream>
using namespace std;
using namespace cv;
static int mouse_x = -1;
static int mouse_y = -1;
Mat circle_eq(Point2f A,Point2f B,Point2f C)
{
    double W[3][3]={{A.x,A.y,1},
                    {B.x,B.y,1},
                    {C.x,C.y,1}};

    double T[3][1]={-(A.x*A.x+A.y*A.y),
                    -(B.x*B.x+B.y*B.y),
                    -(C.x*C.x+C.y*C.y)};
    Mat M=Mat(3,3,CV_64F,W);
    Mat N=Mat(3,1,CV_64F,T);
    Mat L=M.inv()*N;

    return L;
}
void mouseKordinat(int evt, int x, int y, int flags, void* ptr)
{

if(evt == CV_EVENT_MOUSEMOVE)
  {
    mouse_x = x;
    mouse_y = y;
  }
int tik;
  tik = tik + 1;
}

void getPixelValue(Mat img, int x, int y);
Mat image;

int main()
{
 image = imread("c:/qwz/1q.jpg");
 imshow("MyWindow", image);
 setMouseCallback("MyWindow", mouseKordinat, 0 );
tik = tik%=3;

if(tik==0)
{   
int merkez=circle_eq(nokta(0), nokta(1), nokta(2));
circle(image,merkez,3, Scalar(255,255,255),-1,8, nokta(0));
}
if(tik>3)
{
    int nokta[0][0]=0;


}
  waitKey(0);
 return 0;
}

void mouseKordinat(int evt, int c, int r, int flags, void* ptr)
{
 if(evt==CV_EVENT_LBUTTONDOWN)
 {
 getPixelValue(image,r,c);

 }
}

void getPixelValue(Mat img, int r, int c)
{
 Vec3b pix=img.at<Vec3b>(r,c);
 int B = pix.val[0];
 int G = pix.val[1];
 int R = pix.val[2];
 cout<<"Row:"<<r<<" "<<"Column:"<<c<<" - "; 
 cout<<"B:"<<B<<" "<<"G:"<<G<<" "<<"R:"<<R<<"\n"; 

}

什么东西不起作用?当我点击你的代码时,代码不能画圆圈,你的答案有很多错误。看看答案。它是用来画矩形的,但是你可以很容易地修改它来画一个圆。特别是,试着理解如何与鼠标交互并在输出图像上绘制内容。好的,我看一下这个答案,然后试着重新编写代码,然后我将返回查看函数,从3个点获取圆参数。这似乎是错误的。