opencv利用鼠标滑动画出多彩的形状

今天没有继续学习新知识点,画出了一个随鼠标画出的 图形,知识点全都是之前学的,话不多说,先上图:

代码部分:

// opencvMouse.cpp : 定义控制台应用程序的入口点。
//

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

using namespace cv;
using namespace std;

#define WINDOW_NAME "【窗口程序】"

void on_MouseHandle(int event,int x, int y, int flages, void * param);
void DrawRectangle(cv::Mat & img, cv::Rect box);

//全局变量
Rect g_rectangle;
bool g_bDrawingBox = false; //是否进行绘制
RNG rng(12345);

int main()
{
 //【1】准备参数
 Mat srcImage(600,800,CV_8UC3), tempImage;
 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 (true)
 {
 srcImage.copyTo(tempImage); //复制源图到临时变量
 if (g_bDrawingBox)
 {
 DrawRectangle(tempImage, g_rectangle);
 }
 imshow(WINDOW_NAME, tempImage);
 if (waitKey(10) == 27) //按下ESC建,程序退出
 {
 break;
 }
 }
 return 0;
}

void on_MouseHandle(int event, int x, int y, int flages, void * param)
{
 Mat & image = *(cv::Mat*)param;
 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;
 //对宽和高小于0的处理
 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;
 }
}

void DrawRectangle(cv::Mat & img, cv::Rect box)
{
 rectangle(img, box.tl(), box.br(), Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255))); //随机颜色
}

里面就使用通过:

setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);

鼠标的操作来实现绘图.

第一个参数: const string& 类型为winname,窗口的名字

第二个参数:MouseCallBack类型的onMouse,指定窗口里每次鼠标时间发生的时候调用的函数指针

第三个参数: void*  用户定义的传递到回调函数的参数,默认为0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV画任意圆弧曲线

    逆时针画圆弧,原理:将360度分割成36份,分别标出每10度角度时的坐标点,然后将每个点连接起来. #include <iostream> #include <opencv2\core\core.hpp> #include <opencv2\opencv.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\contrib\contrib.hpp> #include <f

  • 使用OpenCV circle函数图像上画圆的示例代码

    OpenCV中circle与rectangle函数显示,只不过rectangle在图像中画矩形,circle在图像中画圆. void circle(Mat img, Point center, int radius, Scalar color, int thickness=1, int lineType=8, int shift=0) img为源图像 center为画圆的圆心坐标 radius为圆的半径 color为设定圆的颜色,规则根据B(蓝)G(绿)R(红) thickness 如果是正数,

  • opencv利用鼠标滑动画出多彩的形状

    今天没有继续学习新知识点,画出了一个随鼠标画出的 图形,知识点全都是之前学的,话不多说,先上图: 代码部分: // opencvMouse.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; #define WINDOW_NAME "[窗

  • 如何在Python中利用matplotlib.pyplot画出函数图详解

    目录 0.引言 1.绘图 (1)导入所需库 (2)设置函数 (3)plt.figure() (4)plt.plot(),plt.axhline(),plt.axvline(),plt.axhspan(),plt.axvspan() (5)设置 x,y 轴的数值范围 (6)设置 x,y 轴的标题文本 (7)设置图例和标题 (8)plt.show() 2运行结果 总结 0.引言 为了让用户能够使用python时,方便地绘制 2D 图表,PYTHON的模块中提供Matplotlib模块中所含的子库py

  • JS拖动鼠标画出方框实现鼠标选区的方法

    本文实例讲述了JS拖动鼠标画出方框实现鼠标选区的方法.分享给大家供大家参考.具体如下: 相当实用的一个JS技巧,拖动鼠标可画出一个方框,可作为一个选区的功能,可以用来画流程图,设计草图什么的,也可以作为上传头像时裁切选择图片,在头像裁切中使用广泛,鼠标在图片上拖动拉出一个方框,这个方框就代表着选区的功能,目前网页上已流行的一种操作.主要是依赖于JavaScript代码来实现. 运行效果如下图所示: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT

  • Opencv使用鼠标任意形状的抠图

    本文实例为大家分享了Opencv使用鼠标任意形状抠图的具体代码,供大家参考,具体内容如下 主要的方法思路是:首先利用鼠标在图上画任意形状,利用掩码将任意形状抠出来 主要难点是怎么填充,因为鼠标在画线的时候,滑动越快,点是不连续的,利用floodFill和drawContours都是没有办法进行填充的,从另一个方面想,一个面是由很多个点组成的,虽然鼠标滑动保存下来的就是一系列点,可以利用这一系列点构成一个面,利用面的性质进行填充就比较简单了. 一.首先使用鼠标点击事件,鼠标点击事件的函数为: vo

  • Python+OpenCV实现鼠标画瞄准星的方法详解

    目录 函数说明 cv2.circle() cv2.line() 简单的例子 利用鼠标回调函数画瞄准星 所谓瞄准星指的是一个圆圈加一个圆圈内的十字线,就像玩射击游戏狙击枪开镜的样子一样.这里并不是直接在图上画一个瞄准星,而是让这个瞄准星跟着鼠标走.在图像标注任务中,可以利用瞄准星进行一些辅助,特别是回归类的任务,使用该功能可以使得关键点的标注更加精准. 关于鼠标回调函数的说明可以参考:opencv-python的鼠标交互操作 函数说明 import cv2后,可以分别help(cv2.circle

  • QT中在QLabel显示图片并且利用鼠标点击画线问题

    目录 在QLabel显示图片并且利用鼠标点击画线 以下为我的代码,供参考 在QLabel显示图片并且利用鼠标点击画线 最近在做在Label上显示图片并且通过鼠标点击画线,在网上查了很多零零散散的东西,收获也多 很多初学者更希望直接贴代码,这样可以模仿来写,我下面直接贴出我的项目中自己写的maLabel类 (如果只是实现利用鼠标绘制, 重写void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *e); void m

  • Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击

    实例如下所示: 复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"><head>    <title>Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击</title>    <script src="JS/jquery-1.9.1.js" type="text/javascript"></

  • 利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer from sklearn import metrics from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split import pylab as p

  • Python利用matplotlib画出漂亮的分析图表

    目录 前言 数据集引入 折线图 饼图 散点图 面积图 直方图 条形图 前言 作为一名优秀的分析师,还是得学会一些让图表漂亮的技巧,这样子拿出去才更加有面子哈哈.好了,今天的锦囊就是介绍一下各种常见的图表,可以怎么来画吧. 数据集引入 首先引入数据集,我们还用一样的数据集吧,分别是 Salary_Ranges_by_Job_Classification以及 GlobalLandTemperaturesByCity.(具体数据集可以后台回复 plot获取) # 导入一些常用包 import pand

随机推荐