C++在图片上画框并返回框的顶点坐标(可选取多个框)

运行代码后会显示用户选择的图片,在图片上鼠标左键点击并拖动绘制矩形框,可绘制多个矩形框,关闭图片后就会在控制台返回每个框的左上角和右下角坐标。

#include <iostream>
#include <algorithm>
#include<string>
//#include <vector>

#include<opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/imgproc/imgproc.hpp>   
#include <opencv2/highgui/highgui_c.h>

//#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;


int fyf_rects[30][4];
int fyf_rectInde = 0;
Point fyf_start, fyf_end;
bool fyf_drawing = false;
Mat fyf_src ;

void onMouse(int event, int x, int y, int flags, void* param)
{
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        fyf_start = Point(x, y);
        fyf_drawing = true;
    }
    else if (event == CV_EVENT_MOUSEMOVE && fyf_drawing)
    {
        Mat src2;
        fyf_src.copyTo(src2);
        //Mat img = *(Mat*)param;
        //img = Scalar::all(0);
        Mat img = src2;
        fyf_end = Point(x, y);
        rectangle(img, fyf_start, fyf_end, Scalar(0, 255, 0));
        for (int i = 0; i < fyf_rectInde; i++)
        {
            rectangle(img, Point(fyf_rects[i][0], fyf_rects[i][1]), Point(fyf_rects[i][2], fyf_rects[i][3]), Scalar(0, 255,0));
        }
        imshow("image", img);
    }
    else if (event == CV_EVENT_LBUTTONUP)
    {
        fyf_drawing = false;
        fyf_end = Point(x, y);
        fyf_rects[fyf_rectInde][0] = fyf_start.x;
        fyf_rects[fyf_rectInde][1] = fyf_start.y;
        fyf_rects[fyf_rectInde][2] = fyf_end.x;
        fyf_rects[fyf_rectInde][3] = fyf_end.y;
        fyf_rectInde++;
    }
    else if (event == CV_EVENT_RBUTTONUP)
    {
        if (fyf_rectInde > 0)
        {
            fyf_rectInde--;
        }
    }
}

int* Rectstoremove(string img_filename){
    Mat img = imread(img_filename);
    img.copyTo(fyf_src);
    imshow("image", img);
    setMouseCallback("image", onMouse, 0);
    waitKey(0);
    int* p = &fyf_rects[0][0];
    return p;
}

int main()
{
    int* k = Rectstoremove("./mydata/0.jpg");
    while(true){
        if (*k == 0 && *(k + 1) == 0 && *(k + 2) == 0 && *(k + 3) == 0) {
            break;
        }
        else {
            cout << *k << "\t";
            cout << *(k + 1) << "\t";
            cout << *(k + 2) << "\t";
            cout << *(k + 3) << endl;
        }
        k += 4;
    }


    return 0;
}



图片中的两个绿色矩形框为所选区域
在这里插入图片描述
运行结果
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值