Opencv c++;画图

Opencv c++;画图,opencv,Opencv,我试图在鼠标点击后在图像上画一个圆圈 #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/nonfre

我试图在鼠标点击后在图像上画一个圆圈

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;


static Mat img_object;

static void onMouse(int event, int x, int y, int, void*){
    Point pt1 = Point(x, y);
    circle(img_object, pt1, 1, Scalar(0, 255, 0), 100, 8, 0);
    imshow("Display window", img_object);
}

int main(int argc, char** argv)
{
    img_object = imread("pic.jpg");

    setMouseCallback("Display window", onMouse, 0);

    imshow("Display window", img_object);

    waitKey(0);

    return 0;
}
#包括
#包括
#包括“opencv2/core/core.hpp”
#包括“opencv2/features2d/features2d.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/calib3d/calib3d.hpp”
#包括“opencv2/nonfree/features2d.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
使用名称空间cv;
静态Mat img_对象;
鼠标上的静态void(int事件、int x、int y、int、void*){
点pt1=点(x,y);
圆(img_对象,pt1,1,标量(0,255,0),100,8,0);
imshow(“显示窗口”,img_对象);
}
int main(int argc,字符**argv)
{
img_object=imread(“pic.jpg”);
setMouseCallback(“显示窗口”,onMouse,0);
imshow(“显示窗口”,img_对象);
等待键(0);
返回0;
}

当我运行它时,会显示图像,但当我单击图像时,不会发生任何事情。

您正在重新定义一个本地垫子:

static Mat img_object = imread("pic.jpg");
在主干道内部,因此遮蔽了全局主干道

将该行替换为:

img_object = imread("pic.jpg");
一切都会好起来的

---- 更好的是,跳过全局对象,并将mat传递给回调函数:

using namespace cv;

static void onMouse(int event, int x, int y, int, void* imgptr){
    if ( event != 1 ) return;     // only draw on lmouse down
    Mat & img = (*(Mat*)imgptr)); // first cast, then deref
    Point pt1 = Point(x, y);
    circle(img, pt1, 1, Scalar(0, 255, 0), 100, 8, 0);
    imshow("Display window", img);
    waitKey(1);
}

int main(int argc, char** argv)
{
    namedWindow("Display window",0);
    Mat img = imread("pic.jpg");
    setMouseCallback("Display window", onMouse, &img); // pass ptr to mat here
    imshow("Display window", img);
    waitKey(0);
    return 0;
}

您正在重新定义本地垫子:

static Mat img_object = imread("pic.jpg");
在主干道内部,因此遮蔽了全局主干道

将该行替换为:

img_object = imread("pic.jpg");
一切都会好起来的

---- 更好的是,跳过全局对象,并将mat传递给回调函数:

using namespace cv;

static void onMouse(int event, int x, int y, int, void* imgptr){
    if ( event != 1 ) return;     // only draw on lmouse down
    Mat & img = (*(Mat*)imgptr)); // first cast, then deref
    Point pt1 = Point(x, y);
    circle(img, pt1, 1, Scalar(0, 255, 0), 100, 8, 0);
    imshow("Display window", img);
    waitKey(1);
}

int main(int argc, char** argv)
{
    namedWindow("Display window",0);
    Mat img = imread("pic.jpg");
    setMouseCallback("Display window", onMouse, &img); // pass ptr to mat here
    imshow("Display window", img);
    waitKey(0);
    return 0;
}

我尝试了你写的代码,但它仍然没有在图像上画一个圈啊,抱歉,仍然调用img_show,还缺少一个waitKey(1);请看编辑我不确定鼠标点击是否调用onMouse函数。我在那里放了一个断点,我没有停在那里。对不起,我的错,这里太草率了:它需要一个额外的namedWindow调用,再次查看编辑。现在它确实画了一个圆,但没有单击。如果鼠标指针在图像上,它只会画一个圆。有没有办法让它只在点击后才画?我尝试了你写的代码,但它仍然没有在图像上画一个圈啊,抱歉,仍然调用img_show,还缺少一个waitKey(1);请看编辑我不确定鼠标点击是否调用onMouse函数。我在那里放了一个断点,我没有停在那里。对不起,我的错,这里太草率了:它需要一个额外的namedWindow调用,再次查看编辑。现在它确实画了一个圆,但没有单击。如果鼠标指针在图像上,它只会画一个圆。有没有办法让它只在点击后绘制?是
圆形(img_对象,pt1,1,标量(0,255,0),100,8,0)做它应该做的事情?你想要一个半径为100的完全填充的绿色圆圈吗?尝试圆(img_对象,pt1,100,标量(0,255,0),-1,8,0)
。上次更改后@berak建议它确实绘制圆,但每次鼠标指针在圆上时都没有鼠标单击。这可能有其他原因。我唯一看到的是,对于绘制一个半径为100像素的填充圆,它通常是指定为100的半径和-1的厚度。在圆调用中,您绘制了一个1像素半径的圆,厚度为100,逻辑上也应该是100像素半径填充的圆,只要厚度在半径内部和外部各扩展一半…就是
圆(img_对象,pt1,1,标量(0,255,0),100,8,0)做它应该做的事情?你想要一个半径为100的完全填充的绿色圆圈吗?尝试圆(img_对象,pt1,100,标量(0,255,0),-1,8,0)
。上次更改后@berak建议它确实绘制圆,但每次鼠标指针在圆上时都没有鼠标单击。这可能有其他原因。我唯一看到的是,对于绘制一个半径为100像素的填充圆,它通常是指定为100的半径和-1的厚度。在圆调用中,您绘制了一个半径为1像素、厚度为100的圆,从逻辑上讲,也应该是100像素半径填充圆,只要厚度在半径内部和外部各扩大一半。。。