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

 更新时间:2020年08月19日 15:47:19   作者:比卡丘不皮  
这篇文章主要为大家详细介绍了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

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

相关文章

  • 带你深度走入C语言取整以及4种函数

    带你深度走入C语言取整以及4种函数

    大家都知道取整这回事,但是对于取整只有单一的认识,下面这篇文章主要给大家介绍了关于C语言取整以及4种函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 分析C语言一个简单程序

    分析C语言一个简单程序

    本文主要介绍C语言简单的程序,这里给大家详细介绍C语言代码,对函数概念、头文件、自定义函数等基础信息的讲解,希望能帮助刚刚学习的同学
    2016-07-07
  • C语言编程中对目录进行基本的打开关闭和读取操作详解

    C语言编程中对目录进行基本的打开关闭和读取操作详解

    这篇文章主要介绍了C语言编程中对目录进行基本的打开关闭和读取操作,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++ 计算时间差的五种方法小结

    C++ 计算时间差的五种方法小结

    本文主要介绍了C++ 计算时间差的五种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 用C语言完整实现2048游戏

    用C语言完整实现2048游戏

    2048是一款数字益智游戏,初始数字则是由2+2组成的基数4。在操作方面的不同则表现为一步一格的移动,变成更为爽快的一次到底。相同数字的方况在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出2048这个数字方块
    2021-11-11
  • 一文详解C++中的转换构造函数

    一文详解C++中的转换构造函数

    在 C/C++ 中,不同的数据类型之间可以相互转换,无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换,本文就给大家详细介绍一下C++的转换构造函数,需要的朋友可以参考下
    2023-09-09
  • C语言使用链表实现学生信息管理系统

    C语言使用链表实现学生信息管理系统

    这篇文章主要为大家详细介绍了C语言使用链表实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C语言植物大战数据结构快速排序图文示例

    C语言植物大战数据结构快速排序图文示例

    这篇文章主要为大家介绍了C语言植物大战数据结构快速排序图文示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C++ 异常处理noexcept正确使用示例详解

    C++ 异常处理noexcept正确使用示例详解

    这篇文章主要为大家介绍了C++ 异常处理noexcept正确使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 基于C++编写一个简单的服务器

    基于C++编写一个简单的服务器

    这篇文章主要为大家详细介绍了如何基于C++编写一个简单的服务器,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03

最新评论