Opencv 和 c++ 框出图片中的目标

主要是使用opencv中的鼠标操作
—-setMOuseCallback函数的作用是为指定窗口设置鼠标回调函数,原型如下。

C++:void setMouseCallback(conststring& winname, MouseCallback onMouse,void* userdata = 0)
/*************************************************************************
    > File Name: 3-3.cpp
    > Author: zsj
    > Mail: fj_zsj@163.com 
    > Created Time: Wed 08 Mar 2017 07:11:58 PM CST
 ************************************************************************/

#include<iostream>
#include <cstdio>
#include <cstdlib>
#include <opencv2/opencv.hpp>

#define WINDOW_NAME "program_window"

using namespace cv;
using namespace std;

void on_MouseHandle(int event, int x, int y, int flags, void* param); //对鼠标触发事件进行判断处理
void DrawRectangle(cv::Mat& img, cv::Rect box); //画出矩形

int cnt;
Rect g_rectangle;           
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);          //Scalar格式

int main(int argc, char **argv)
{
        [1]初始化参数
    cnt = 0;
    g_rectangle = Rect(-1, -1, 0, 0);  

    Mat srcImage = imread("1.jpg");
    Mat tempImage;

    if ( !srcImage.data ) printf("read image fail!\n");

    srcImage.copyTo(tempImage);

//  g_rectangle = Rect(-1, -1, 0, 0);
//  srcImage = Scalar::all(0);       
        [2]设置鼠标操作回调函数
    namedWindow(WINDOW_NAME);
    setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);

        [3]开始判断是否进行绘制操作
    while(1) {
        srcImage.copyTo(tempImage); //复制源图到临时变量
        if( g_bDrawingBox ) DrawRectangle( tempImage, g_rectangle);

        imshow(WINDOW_NAME, tempImage);
        if (waitKey(10) == 27) break; //按下ESC键,程序退出
    }

    return 0;
}

//  鼠标回调函数,根据不同的鼠标事件进行不同的操作 
void on_MouseHandle(int event, int x, int y, int flags, void* param) {
    Mat& image = *(cv::Mat*) param;
    printf("----------<x,y>-----------\n");
    printf("cnt = %d, <%d %d>\n", ++cnt, x, y);
        printf("----------<x,y>-----------\n");
    switch( event ) {
            // 鼠标移动消息     
        case EVENT_MOUSEMOVE:{
                                 if (g_bDrawingBox) { 
                                  //绘制标识为真,则记录下长和宽到RECT变量中
                                     g_rectangle.width = x - g_rectangle.x;
                                     g_rectangle.height = y - g_rectangle.y;
                                 }
                             }
                             break;
        //左键按下消息
       case EVENT_LBUTTONDOWN:{ 
                                   g_bDrawingBox = true;
                                  g_rectangle = Rect(x, y, 0, 0);
                              }
                              break;
        //左键抬起消息
      case EVENT_LBUTTONUP: {
                                g_bDrawingBox = false;
                                if (g_rectangle.width < 0) {
                                    g_rectangle.x += g_rectangle.width;
                                    g_rectangle.width *= -1;
                                }

                                if (g_rectangle.height < 0) {
                                    g_rectangle.y += g_rectangle.height;
                                    g_rectangle.height *= -1;
                                }

                                DrawRectangle(image, g_rectangle );
                            }
                            break;
     default: printf("error!\n");
    }
}

//自定义的矩形绘制函数
void DrawRectangle(cv::Mat& img, cv::Rect box){
    rectangle(img, box.tl(), box.br(), Scalar(RNG(210), RNG(0),RNG(90)), 2, 1, 0);
}

Reference:
《OpenCV3编程入门》
《数字图像处理》
《c++编程》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值