在openCV c++中绘制矩形

jbose2ul  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(110)

我试图画矩形使用鼠标作为输入与Opencv在c++。我想通过拖放来画一个矩形。
我怎样才能画出干净的矩形?在这里我可以看到画一个真正的矩形。就像我们在油漆里做的那样

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

Mat img;
Point ptOld;
void on_mouse(int event, int x, int y, int flags, void*);

 int main(void)
 {
     img = imread("lenna.bmp");

     if (img.empty()) {
         cerr << "Image load failed" << endl;
         return -1;
     }

     namedWindow("img");
     setMouseCallback("img", on_mouse);
     imshow("img", img);
     waitKey(0);

     return 0;
 }

 void on_mouse(int event, int x, int y, int flags, void*)
 {
     switch (event) {
     case EVENT_LBUTTONDOWN:
         ptOld = Point(x, y);
         break;

     case EVENT_LBUTTONUP:
         ptOld = Point(x, y);
         break;

     case EVENT_MOUSEMOVE:
         if (flags & EVENT_FLAG_LBUTTON) {
             rectangle(img, ptOld, Point(x,y), Scalar(0, 255, 0), 3);
             imshow("img", img);
             ptOld = Point(x, y);

         }
         break;

     default:
         break;
         
     }
 }

lenna
有人能告诉我为什么会这样吗有什么解决办法吗??
我想要这个结果。
[示例] https://i.stack.imgur.com/hvXMP.png

z3yyvxxp

z3yyvxxp1#

你应该在两个图像上操作。一个是通过鼠标移动事件绘制当前选中的矩形。当按钮事件发生时,此图像是下一个矩形绘制操作的入口点,并且应该存储在第二个图像中。

Mat tempImg, imgWithRects;
Point ptOld;
void on_mouse(int event, int x, int y, int flags, void*);

int main(void) {
    imgWithRects = imread("lenna.bmp"); 
    if (imgWithRects.empty()) {
         cerr << "Image load failed" << endl;
         return -1;
    }
    namedWindow("img");
    setMouseCallback("img", on_mouse);
    imshow("img", imgWithRects);
    waitKey(0);
    return 0;
}

void on_mouse(int event, int x, int y, int flags, void*)
{
 switch (event) {
 case EVENT_LBUTTONDOWN:
     ptOld = Point(x, y);
     break;
 case EVENT_LBUTTONUP:
     ptOld = Point(x, y);
     if (!tempImg.empty())
         imgWithRects = tempImg.clone();
     break;
 case EVENT_MOUSEMOVE:
     if (flags & EVENT_FLAG_LBUTTON) {
         tempImg = imgWithRects.clone();
         rectangle(tempImg, ptOld, Point(x,y), Scalar(0, 255, 0), 3);
         imshow("img", tempImg);
     }
     break;
 default:
     break;   
 }
}

相关问题