当前位置: 首页 > ds >正文

OpenCV学习3

1、创建图像窗口滑动条

OpenCV 4中通过createTrackbar()函数在显示图像的窗口上创建滑动条。

int cv::createTrackbar(const String &trackbarname,const String &winname,  int *value,            int count,              TrackbarCallback onChange = 0, void *userdata = 0      
);

trackbarname:滑动条的名称
winname:创建滑动条窗口的名称
value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义
count:滑动条的最大取值
onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void *);,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值
userdata:传递给回调函数的可选参数

示例代码

// myCreateTrackbar在图像中创建滑条改变图像亮度
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;// 为了能在被调函数中使用,所以设置成全局的
int value;
void callBack(int, void*); // 滑动条回调函数
Mat img1, img2;int main()
{img1 = imread("lena.png");if (!img1.data){cout << "请确认是否输入正确的图像文件" << endl;return -1;}namedWindow("滑动条改变图像亮度");imshow("滑动条改变图像亮度", img1);value = 100; // 滑动条创建时的初值// 创建滑动条createTrackbar("亮度值百分比", "滑动条改变图像亮度", &value, 600, callBack, 0);waitKey();
}static void callBack(int, void*)
{float a = value / 100.0;img2 = img1 * a;imshow("滑动条改变图像亮度", img2);
}

2、鼠标响应

// setMouseCallback()函数原型
void cv::setMouseCallback(const String & winname,MouseCallback onMouse,
void * userdata = 0);

winname:添加鼠标响应的窗口的名字
onMouse:鼠标响应的回调函数
userdata:传递给回调函数的可选参数

// MouseCallback类型的回调函数
typedef void(* cv::MouseCallback)(int event,      int x,   int y,   int flags,  void *userdata 
);

event:鼠标响应事件标志,参数为EVENT_*形式,具体可选参数及含义在表1给出
x:鼠标指针在图像坐标系中的x坐标
y:鼠标指针在图像坐标系中的y坐标
flags:鼠标响应标志,参数为EVENT_FLAG_*形式,具体可选参数及含义在表2给出
userdata:传递给回调函数的可选参数

MouseCallback类型回调函数鼠标响应事件标志可选参数及含义

标志参数

简记

含义

EVENT_MOUSEMOVE

0

表示鼠标指针在窗口上移动

EVENT_LBUTTONDOWN

1

表示按下鼠标左键

EVENT_RBUTTONDOWN

2

表示按下鼠标右键

EVENT_MBUTTONDOWN

3

表示按下鼠标中键

EVENT_LBUTTONUP

4

表示释放鼠标左键

EVENT_RBUTTONUP

5

表示释放鼠标右键

EVENT_MBUTTONUP

6

表示释放鼠标中键

EVENT_LBUTTONDBLCLK

7

表示双击鼠标左键

EVENT_RBUTTONDBLCLK

8

表示双击鼠标右键

EVENT_MBUTTONDBLCLK

9

表示双击鼠标中间

EVENT_MOUSEWHEEL

10

正值表示向前滚动,负值表示向后滚动

EVENT_MOUSEHWHEEL

11

正值表示向左滚动,负值表示向右滚动

MouseCallback类型回调函数鼠标响应标志及含义

标志参数

简记含义
EVENT_FLAG_LBUTTON1按住左键拖拽
VENT_FLAG_RBUTTON2按住右键拖拽
EVENT_FLAG_MBUTTON4按住中键拖拽
EVENT_FLAG_CTRLKEY

8

按下CTRL键
EVENT_FLAG_SHIFTKEY16按下SHIFT键
EVENT_FLAG_ALTKEY32按下ALT键

示例代码

// 绘制鼠标的移动轨迹
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;Mat img, imgPoint; // 全局的图像
Point prePoint; // 前一时刻鼠标的坐标,用于绘制直线
void mouse(int event, int x, int y, int flags, void*);int main()
{img = imread("lena.png");if (!img.data){cout << "请确认输入图像名称是否正确!" << endl;return -1;}img.copyTo(imgPoint);imshow("图像窗口1", img);imshow("图像窗口2", imgPoint);setMouseCallback("图像窗口1", mouse, 0); // 鼠标影响waitKey(0);return 0;
}void mouse(int event, int x, int y, int flags, void*)
{if (event == EVENT_RBUTTONDOWN) // 单击右键{cout << "点击鼠标左键才可以绘制轨迹" << endl;}if (event == EVENT_LBUTTONDOWN) // 单击左键,输出坐标{prePoint = Point(x, y);cout << "轨迹起使坐标" << prePoint << endl;}if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) // 鼠标按住左键移动{// 通过改变图像像素显示鼠标移动轨迹imgPoint.at<Vec3b>(y, x) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y, x-1) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y, x+1) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y+1, x) = Vec3b(0, 0, 255);imgPoint.at<Vec3b>(y+1, x) = Vec3b(0, 0, 255);imshow("图像窗口2", imgPoint);// 通过绘制直线显示鼠标移动轨迹Point pt(x, y);line(img, prePoint, pt, Scalar(0, 0, 255), 2, 5, 0);prePoint = pt;imshow("图像窗口1",

3、图像直方图绘制

http://www.xdnf.cn/news/14882.html

相关文章:

  • Java面试宝典:基础三
  • 学习React官方文档(描述UI)
  • 《弦论视角下前端架构:解构、重构与无限延伸的可能》
  • mapstate
  • OSPF(开放最短路径优先)
  • 【NLP 实战】蒙古语情感分析:从 CNN 架构设计到模型训练的全流程解析(内附项目源码及模型成果)
  • 认知智能平台搭载LLM+RAG,重构行业洞察与决策支持体系!
  • 实战四:基于PyTorch实现猫狗分类的web应用【2/3】
  • PCB设计实践(三十七)PCB机械孔设计全解析:作用原理与设计规范指南
  • MyBatis实战指南(八)MyBatis日志
  • ai数据分析黄金
  • ideal2025安装教程
  • Elasticsearch 集群升级实战指引—7.x 升级到 8.x
  • 流量低、获客越来越难?创客匠人让知识变现不走弯路
  • HarmonyOS NEXT仓颉开发语言实战案例:健身App
  • redis延时双删,为什么第一次删除
  • 什么是 Solidity 以太坊上主流合约语言?
  • 【大语言模型入门】—— 浅析LLM基座—Transformer原理
  • Hive SQL 快速入门指南
  • Linux基本命令篇 —— less命令
  • 华为云Flexus+DeepSeek征文|利用华为云一键部署的Dify平台构建高效智能电商客服系统实战
  • 【论文阅读笔记】知网SCI——基于主成分分析的空间外差干涉数据校正研究
  • java进阶
  • 基于Uniapp+SpringBoot+Vue 的在线商城小程序
  • matplotlib 绘制水平柱状图
  • Java面试题030:一文深入了解MySQL(2)
  • Geollama 辅助笔记:raw_to_prompt_strings_geo.py
  • 印度和澳洲的地理因素
  • BUUCTF [ACTF新生赛2020]music 1
  • TCP 和 UDP 是什么?