Opencv c ++在图像上绘图

时间:2014-01-12 20:15:02

标签: 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/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;
}

当我运行它时会显示图像,但是当我点击图像时没有任何反应。

1 个答案:

答案 0 :(得分:4)

你正在重新宣布当地的Mat:

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;
}