opencv利用鼠标滑动画出多彩的形状
作者:比卡丘不皮 发布时间:2023-11-03 05:20:57
标签: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
来源:https://blog.csdn.net/weixin_42126427/article/details/106278486


猜你喜欢
- AES简介AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预
- 一.什么是SemaphoreSemaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueu
- 1、找奇数:public static boolean isOdd(int i){ return i % 2 == 1; }上面的方法真
- 如下所示:package cn.jdk.foreach;import java.util.HashMap;import java.util.
- 在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联
- 本文以实例形式讲述了C语言实现二叉树的非递归遍历方法。是数据结构与算法设计中常用的技巧。分享给大家供大家参考。具体方法如下:先序遍历:voi
- 多线程可以说是面试官最喜欢拿来问的题目之一了,可谓是老生之常谈,不管你是新手还是老司机,我相信你一定会在面试过程中遇到过有关多线程的一些问题
- 对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸 * setOnTouchListener即
- 前面两篇文章,分别简述了多线程的使用和发展历程,但是使用多线程无法避免的一个问题就是多线程安全。那什么是多线程安全?如何解决多线程安全?本文
- 前言Feign是Netflix开源的声明式HTTP客户端,致力于让编写http client更加简单,Feign可以通过声明接口自动构造请求
- Android的WebView做不到ios的WebView那样可以很方便的直接预览pdf文件。要实现利用WebView预览pdf我们可以使用
- 近期发现C盘空闲空间剩余不多了,经过检查发现在C:\Users\<电脑用户名>\的目录下,有这两个文件夹空间比较大,这两文件夹分
- 前言本篇文章主要讲述的是SpringBoot整合Mybatis、Druid和PageHelper 并实现多数据源和分页。其中SpringBo
- 队列在编程语言中是如何定义的呢?小编与大家分享自己的经验。队列的定义队列是限制结点插入操作固定在一端进行,而结点的删除操作固定在另一端进行的
- 前言最近写了一篇博客是关于 使用Jenkins来构建SVN+Maven项目 ,这里使用的的代码版本工具是SVN,但是事实上也有很多公司使用G
- 1.现象描述原来项目在Android studio 2.3一切正常,升级3.0之后报如下错误:Error:Cannot choose bet
- 最近项目上产品经理提了个需求,要求关闭语言国际化,不管手机系统设置那个国家的语言,都要显示汉语,好吧,既然有需求,那就做吧。但是项目中已经有
- Java * 要想了解Java * ,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有
- 关于怎么一次退出所有Activity网上有很多很多种说法,比如用杀进程的方式:android.os.Process.killProcess(
- 安装完jdk环境后,编写第一个java程序hello.java:public class hello{