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

OpenCV通过鼠标提前ROI(C++实现)

文章目录

    • 鼠标绘制矩形提取ROI
    • 任意形状绘制提前ROI

废话不多说,直接上代码

鼠标绘制矩形提取ROI

#include <iostream>  
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/core/core.hpp>using namespace cv;
using namespace std;// 全局变量图像源
cv::Mat srcImage;
cv::Mat roiImage;
// 起始点
cv::Point startPoint;
// 终止点
cv::Point endPoint;
// 完成所选区域标志位
bool downFlag = false;
bool upFlag = false;void MouseEvent(int event, int x, int y, int flags, void* data)
{// 鼠标左键按下 获取起始点if (event == EVENT_LBUTTONDOWN){downFlag = true;startPoint.x = x;startPoint.y = y;}// 鼠标拖到松开 获取终止点if (event == EVENT_LBUTTONUP){upFlag = true;endPoint.x = x;endPoint.y = y;}// 显示鼠标选择的图像区域if (downFlag == true && upFlag == false){Point tempPoint;tempPoint.x = x;tempPoint.y = y;// 用于显示图像生成cv::Mat tempImage = srcImage.clone();cv::rectangle(tempImage, startPoint, tempPoint, Scalar(0, 0, 255), 2, 3, 0);cv::imshow("cut", tempImage);}   // 选择区域生成if (downFlag == true && upFlag == true){// 所选矩形区域 cv::Rect roiRect;// 获取选择区域的ROIroiRect.width = abs(startPoint.x - endPoint.x);roiRect.height = abs(startPoint.y - endPoint.y);roiRect.x = min(startPoint.x, endPoint.x);roiRect.y = min(startPoint.y, endPoint.y);cout << "rect: " << roiRect << endl;if (roiRect.width > 0 && roiRect.height > 0){cv::Mat roiMat(srcImage, roiRect);imshow("ROI", roiMat);imwrite("roi.tif", roiMat);}downFlag = false;upFlag = false;}
}int main()
{Mat src = cv::imread("tt.jpg");if (src.empty())return -1;namedWindow("cut", WINDOW_AUTOSIZE);// 回调事件响应::srcImage = src.clone();cv::namedWindow("cut");cv::imshow("cut", srcImage);cv::setMouseCallback("cut", MouseEvent, 0);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

在这里插入图片描述
在这里插入图片描述

任意形状绘制提前ROI

#include <iostream>  
#include <vector>
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/core/core.hpp>
#define CV_AA 16using namespace cv;cv::Mat src, tempMat;
cv::Mat dst, maskImage;
std::vector<cv::Point> vctPoint;
cv::Point ptStart = (-1, -1); //初始化起点
cv::Point cur_pt = (-1, -1);  //初始化临时节点void on_mouse(int event, int x, int y, int flags, void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号    
{if (event == EVENT_LBUTTONDOWN){std::cout << "x:" << x << " y:" << y << std::endl;ptStart = cv::Point(x, y);vctPoint.push_back(ptStart);cv::circle(src, ptStart, 1, cv::Scalar(255, 0, 255), FILLED, CV_AA, 0);cv::imshow("图片", src);}else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)){std::cout << "x:" << x << " y:" << y << std::endl;cur_pt = cv::Point(x, y);cv::line(src, vctPoint.back(), cur_pt, cv::Scalar(0, 255, 0, 0), 1, 8, 0);cv::imshow("图片", src);vctPoint.push_back(cur_pt);}else if (event == EVENT_LBUTTONUP){std::cout << "x:" << x << " y:" << y << std::endl;cur_pt = cv::Point(x, y);cv::line(src, ptStart, cur_pt, cv::Scalar(0, 255, 0, 0), 1, 8, 0);cv::imshow("图片", src);vctPoint.push_back(cur_pt);//把点构成任意多边形进行填充const cv::Point * ppt[1] = { &vctPoint[0] };//取数组的首地址int len = vctPoint.size();int npt[] = { len };std::cout << len << std::endl;src.copyTo(maskImage);maskImage.setTo(cv::Scalar(0, 0, 0, 0));cv::fillPoly(maskImage, ppt, npt, 1, cv::Scalar(0, 255, 255, 255));src.copyTo(dst, maskImage);cv::imshow("抠图", dst);// 清空上次绘制的点vctPoint.clear();vctPoint.resize(0);vctPoint.shrink_to_fit();std::cout << "Vector is " << (vctPoint.empty() ? "empty." : "not empty.") << std::endl;std::cout << "Capacity is " << vctPoint.capacity() << std::endl;dst.setTo(0);src = tempMat.clone();cv::waitKey(0);}
}int main()
{src = cv::imread("src.jpg");tempMat = src.clone();//鼠标点击cv::namedWindow("图片");//定义一个img窗口    cv::setMouseCallback("图片", on_mouse, 0);//调用回调函数    cv::imshow("图片", src);cv::waitKey(0);return 0;
}

在这里插入图片描述
在这里插入图片描述
如果觉得以上代码对你有帮助,那就一键三连吧。

相关文章:

OpenCV通过鼠标提前ROI(C++实现)

文章目录 鼠标绘制矩形提取ROI任意形状绘制提前ROI 废话不多说&#xff0c;直接上代码 鼠标绘制矩形提取ROI #include <iostream> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp>us…...

6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)

目录 一.堆(Heap)的基本介绍 二.堆的常用操作&#xff08;以小根堆为例&#xff09; 三.实现代码 3.1 堆结构定义 3.2 向下调整算法* 3.3 初始化堆* 3.4 销毁堆 3.4 向上调整算法* 3.5 插入数据 3.6 删除数据 3.7 返回堆顶数据 四.下篇内容 1.堆排序 2.TopK问题 一…...

【智能终端】HBuilder X 与微信开发者工具集成与调试实战

目录 1. 需求和理解库、框架、平台 1.1 需求 1.2 理解 2.3 库、框架、平台 2.3.1 库&#xff08;Library&#xff09; 2.3.2 框架&#xff08;Framework&#xff09; 2.3.3 平台&#xff08;Platform&#xff09; 2.3.4 总结 2. 使用 HBuilder X 创建第一个 uni-app 应…...

结构体的字节对齐方式(__attribute_pack(packed))#pragma pack())

结构体的字节对齐方式&#xff08;__attribute_pack(packed))&#pragma pack()) 1、编译器的字节对齐方式 当前编译器都有默认的字节对齐方式&#xff0c; struct PackedStruct {char a;int b;short c; };如上代码段中的结构体&#xff0c;在编译运行后发现他的大小并不…...

若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)

idea抽取独立方法快捷键&#xff1a;ctrlaltm TaskDto.java package com.dkd.manage.service.impl;import java.time.Duration; import java.util.List; import java.util.stream.Collectors;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUti…...

ModuleNotFoundError: No module named ‘keras.layers.core‘怎么解决

问题 ModuleNotFoundError: No module named keras.layers.core&#xff0c;如图所示&#xff1a; 如何解决 将from keras.layers.core import Dense,Activation改为from tensorflow.keras.layers import Dense,Activation&#xff0c;如图所示&#xff1a; 顺利运行&#xf…...

C++(三)----内存管理

1.C/C内存分布 看下面这个问题&#xff08;考考你们之前学的咋样&#xff09;&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pCh…...

使用 ShuffleNet 模型在 CIFAR-100 数据集上的图像分类

简介 在深度学习领域&#xff0c;图像分类任务是衡量算法性能的重要基准。本文将介绍我们如何使用一种高效的卷积神经网络架构——ShuffleNet&#xff0c;来处理 CIFAR-100 数据集上的图像分类问题。 CIFAR-100 数据集简介 CIFAR-100 数据集是一个广泛使用的图像分类数据集&…...

怎么利用短信接口发送文字短信

在当今这个快节奏的数字时代&#xff0c;即时通讯已成为人们日常生活和工作中不可或缺的一部分。而短信接口&#xff08;SMS Interface&#xff09;&#xff0c;作为传统与现代通讯技术结合的典范&#xff0c;凭借其高效、稳定、广泛覆盖的特性&#xff0c;在众多领域发挥着不可…...

【C#生态园】提升C#开发效率:掌握这六款单元测试利器

从xUnit到SpecFlow&#xff1a;C#测试驱动开发全指南 前言 在C#开发中&#xff0c;单元测试和模拟框架是至关重要的工具&#xff0c;它们可以帮助开发人员确保代码的质量和可靠性。本文将介绍一些常用的C#单元测试框架和相关库&#xff0c;包括xUnit、NUnit、Moq、FluentAsse…...

【QT】自制一个简单的小闹钟,能够实现语音播报功能

做了一个自制的小闹钟&#xff0c;能够自己输入时间&#xff0c;以及对应的闹铃&#xff0c;时间到了自动播放设定的闹铃&#xff0c;可以随时取消重新设定&#xff0c;采用分文件编译 注意&#xff1a;需要在.pro文件中加入&#xff1a;QT core gui texttospeech 代码…...

基于深度学习的图像描述生成

基于深度学习的图像描述生成&#xff08;Image Captioning&#xff09;是一种将计算机视觉与自然语言处理结合的任务&#xff0c;其目标是通过自动生成自然语言来描述输入的图像。该技术能够理解图像中的视觉内容&#xff0c;并生成相应的文本描述&#xff0c;广泛应用于视觉问…...

Linux和C语言(Day11)

一、学习内容 讲解有参函数 形参 和 实参 形参——定义时的参数&#xff0c;形式上的参数&#xff0c;没有实际意义&#xff0c;语法上必须带有数据类型 void fun(int a,int b); void fun(int a[],int n); void fun(char *s); 可以是&#xff1a;变量、数组、指针 实参——调用…...

使用Zlib库进行多文件或者多文件夹的压缩解压缩

zlib库可在git上自己clone下来然后使用cmake工具生成解决方案&#xff0c;编译、生成zlib二进制文件。然后将zlib库引入项目&#xff1a; //zlib库支持 #include "../zlib/include/zlib.h" #ifdef _DEBUG #pragma comment(lib, "../zlib/lib/zlibd.lib") …...

CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案

强强联合 人工智能与大数据的迅速发展&#xff0c;大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分&#xff0c;企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战&#xff0c;CSGHub、Nvidia和阿里云计算巢强强联手&a…...

opencv的球面投影

cv::detail::SphericalProjector 在全景图像拼接任务中&#xff0c;可能需要对多个图像进行球面投影以实现无缝拼接。每个cv::detail::SphericalProjector可以负责一个图像的球面投影操作。通过将多个这样的投影器存储在std::vector中&#xff0c;可以对一组图像依次进行投影处…...

5. 去中心化应用(dApp)

去中心化应用&#xff08;dApp&#xff09; 去中心化应用&#xff08;dApp&#xff09;是基于区块链技术构建的应用程序&#xff0c;其核心特性是去中心化、透明和开放。dApp与传统应用有许多显著的区别&#xff0c;它们在实现和功能上都带来了新的变革。以下是对dApp的详细介…...

k8s服务发布Ingress

Kubernetes暴露服务的方式目前只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff0c;通俗来讲&#xff0c;ingress和之前提到的Service、Deployment&#xff0c;也是一个k8s的资源类型&#xff0c;ingress用于实现用域名的方式访问k8s内部应用。 In…...

区块链学习笔记1--比特币

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说&#xff1a;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…...

在 Vite 项目中自动为每个 Vue 文件导入 base.less

在 Vue.js 项目中&#xff0c;使用 Less 作为 CSS 预处理器时&#xff0c;我们通常会创建一个全局的样式文件&#xff08;如 base.less&#xff09;&#xff0c;用于存放一些全局变量、混合、通用样式等。为了避免在每个 Vue 组件中手动导入这个文件&#xff0c;我们可以通过配…...

盲人出行辅助系统原型

我做了一个很有意义的盲人出行辅助系统原型&#xff0c;主要是结合现有导航OSRM/高德&#xff0c;实时感知前方潜在危险目标&#xff0c;辅助视障人士出行。 持续优化中&#xff08;20260519&#xff09;&#xff0c;欢迎大家尝试&#xff0c;有一些想法也可以提出来。 开源地址…...

【DC实战】时序约束文件编写:从理论到实践

1. 时序约束文件的重要性 在数字电路设计中&#xff0c;时序约束文件就像是给电路设计的一本"交通规则手册"。想象一下&#xff0c;如果没有红绿灯和限速标志&#xff0c;城市交通会乱成什么样子&#xff1f;时序约束文件的作用就是告诉DC&#xff08;Design Compile…...

电机PID调参总翻车?试试VOFA+这个“示波器”功能,实时对比目标与实际值

电机PID调参实战&#xff1a;用VOFA实现波形可视化诊断 调试电机PID控制器时&#xff0c;最令人头疼的莫过于面对一堆抽象数据却无法直观理解系统行为。传统方法依赖串口打印数值或简单示波器观察&#xff0c;往往需要反复修改参数、重新烧录程序&#xff0c;效率低下且容易错过…...

告别龟速下载!Windows下用VSCode离线包5分钟搞定ESP-IDF环境(附镜像加速)

5分钟极速部署&#xff1a;Windows下VSCode与ESP-IDF开发环境实战指南 当第一次接触ESP32开发时&#xff0c;许多开发者都会遇到一个共同的难题——官方工具链的下载速度慢如蜗牛。这不仅浪费宝贵时间&#xff0c;还可能让初学者在配置阶段就失去耐心。本文将分享一套经过实战…...

双人成行2026最新官方正版免费下载 520情侣必玩 一键转存 永久更新 (看到速转存 资源随时走丢)

下载链接 # 编织奇迹的合作历程&#xff1a;《双人成行》的幕后、机制与同类作品剖析 在现代电子游戏领域&#xff0c;纯粹专注于双人合作的游戏并不多见&#xff0c;而能将其做到极致并斩获行业高额荣誉的作品&#xff0c;更是凤毛麟角。由Hazelight Studios开发的《双人成行…...

Keil C51评估版SRC指令限制解析与解决方案

1. 问题现象与背景解析最近在调试一个基于8051架构的嵌入式项目时&#xff0c;遇到了一个令人困惑的编译错误。当我在Keil C51开发环境中使用SRC指令时&#xff0c;编译器突然报出致命错误(Fatal Error)&#xff0c;但检查代码语法看起来完全正确。这个SRC指令是用来控制编译器…...

Perplexity不是越低越好!资深NLP架构师亲授:3类典型查询场景下的阈值黄金区间

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity不是越低越好&#xff01;资深NLP架构师亲授&#xff1a;3类典型查询场景下的阈值黄金区间 Perplexity&#xff08;困惑度&#xff09;常被误认为语言模型性能的“万能标尺”&#xff0c;但实际部署…...

为什么你的离心风扇仿真总不准?建模方法与调速策略深度拆解

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 211、985硕士&#xff0c;从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作&#xff0c;涉足消费电子、新能源、医疗设备、制药信息化、核工业等…...

3个真实场景告诉你,Avogadro 2分子建模软件如何改变化学研究方式

3个真实场景告诉你&#xff0c;Avogadro 2分子建模软件如何改变化学研究方式 【免费下载链接】avogadroapp Avogadro is an advanced molecular editor designed for cross-platform use in computational chemistry, molecular modeling, bioinformatics, materials science, …...

Lenovo Legion Toolkit 终极指南:如何让你的拯救者笔记本性能提升30%

Lenovo Legion Toolkit 终极指南&#xff1a;如何让你的拯救者笔记本性能提升30% 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...