opencv imshow 大图片显示,拖动显示
用imshow显示大图片,不能完整显示,不方便。
结合网友的代码,修改成现在的代码,可以拖动图片,方便查看完整图片。
而且方便调试,只需要用MatShow替换imshow。
struct MouseParam
{
int m_WinWidth; //窗口大小
int m_WinHeight; cv::String m_WinName;//窗口名称 cv::Point m_RoiLeftUp; //Roi区域左上角在原图中的坐标,初始值为(0,0)
cv::Mat m_Roi; //最终显示出来的Roi区域的图像矩阵 cv::Mat m_Src; //原始图像 cv::Point m_StartDrag;
cv::Point m_EndDrag;
bool m_Dragging; cv::Point m_PrevMouse;
}; void onMouse(int event, int x, int y, int flags, void* param)
{
MouseParam * mp = (MouseParam*)param; cv::Point &prevMouse = mp->m_PrevMouse;
int &roi_width = mp->m_WinWidth;
int &roi_height = mp->m_WinHeight; // 可以根据自己的显示屏分辨率自行设置
cv::Point &roi_lt = mp->m_RoiLeftUp; // roi区域左上角在原图中的坐标,初始值为(0,0)
cv::Mat &roi = mp->m_Roi; // 最终显示出来的roi区域的图像矩阵 cv::Point &startDrag = mp->m_StartDrag;
cv::Point &endDrag = mp->m_EndDrag;
bool &dragging = mp->m_Dragging; cv::Mat disp = mp->m_Src.clone(); cv::String &winName = mp->m_WinName; if (event == cv::EVENT_LBUTTONDOWN)
{// 如果鼠标左键按下,则为开始拖动,记录下拖动起始点,并将dragging标志位设为true
startDrag = cv::Point(x, y);
prevMouse = startDrag;
dragging = true;
}
else if (event == cv::EVENT_LBUTTONUP)
{// 如果鼠标左键松开,则为结束拖动,记录下拖动结束点,并将其与拖动起始点的差值加在roi_lt上,并将dragging标志位设为false
//cv::Mat disp = (*(cv::Mat*)param).clone();
endDrag = cv::Point(x, y);
roi_lt += (startDrag - endDrag);
// 判断拖动终点是否超出边界
if (roi_lt.x < 0) roi_lt.x = 0;
if (roi_lt.y < 0) roi_lt.y = 0;
if (roi_lt.x > (disp.cols - roi_width)) roi_lt.x = disp.cols - roi_width;
if (roi_lt.y > (disp.rows - roi_height))roi_lt.y = disp.rows - roi_height;
dragging = false;
// 在原图disp上裁剪出roi区域内的像素并显示
cv::Rect roiRect(roi_lt.x, roi_lt.y, roi_width, roi_height);
roi = disp(roiRect).clone();
cv::imshow(winName, roi);
}
else if (event == cv::EVENT_MOUSEMOVE && dragging)
{// 如果鼠标在按住左键的状态下移动,则一直更新画面
//cv::Mat disp = (*(cv::Mat*)param).clone();
cv::Point mousePos(x, y);
roi_lt += (prevMouse - mousePos);
if (roi_lt.x < 0) roi_lt.x = 0;
if (roi_lt.y < 0) roi_lt.y = 0;
if (roi_lt.x > (disp.cols - roi_width)) roi_lt.x = disp.cols - roi_width;
if (roi_lt.y > (disp.rows - roi_height))roi_lt.y = disp.rows - roi_height;
prevMouse = mousePos;
cv::Rect roiRect(roi_lt.x, roi_lt.y, roi_width, roi_height);
roi = disp(roiRect).clone();
cv::imshow(winName, roi);
}
} void MatShow(const cv::String &winname,cv::Mat &mat)
{
MouseParam * mp = new MouseParam;
mp->m_WinWidth = 1000;
mp->m_WinHeight= 800;
mp->m_WinName = winname;
mp->m_Src = mat.clone(); cv::Rect roiRect(mp->m_RoiLeftUp.x, mp->m_RoiLeftUp.y, mp->m_WinWidth, mp->m_WinHeight);
mp->m_Roi = mat(roiRect).clone(); // roi cv::namedWindow(winname);
cv::resizeWindow(winname, cv::Size(mp->m_WinWidth, mp->m_WinHeight));
cv::setMouseCallback(winname, onMouse, mp); // whole display image cv::imshow(winname, mp->m_Roi);
}
用MatShow替换imshow
opencv imshow 大图片显示,拖动显示的更多相关文章
- TensorFlow与OpenCV,读取图片,进行简单操作并显示
TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...
- c++ opencv 3.2 +Mfc VS2015窗体显示图片方法
本文仅涉及一些核心步骤,具体 OpenCV 的配置以及其他的细节问题,请参考 VS2010 / MFC + OpenCV 2.4.1打开图片. 1. 新建 MFC 对话框项目 基于对话框,不使用Uni ...
- android高仿微信UI点击头像显示大图片效果
用过微信的朋友朋友都见过微信中点击对方头像显示会加载大图,先贴两张图片说明下: 这种UI效果对用户的体验不错,今天突然有了灵感,试着去实现,结果就出来了.. 下面说说我的思路: 1.点击图片时跳转到另 ...
- echart 时间轴、以及y轴值过大但是变化不大显示感觉不出变化的问题+弹出框拖动div事件
1.时间轴 echart 提供了一种图表,如果x轴是一个时间范围,并且是连续的,如果用传统的数据驱动会很慢,所以用时间轴的方式 function initCurve(_data){ var resul ...
- 使用QT显示OpenCV读取的图片
目录 1. 概述 2. 实现 2.1. 代码 2.2. 解析 3. 结果 1. 概述 OpenCV自带了一部分常用的GUI功能,但是更多的图像处理功能需要其他GUI框架来辅助实现,这里通过QT来显示O ...
- jQuery点缩略图显示大图片
2015年繁忙的一月份,无更多时间去学习ASP.NET MVC程序,二月份又是中国的新年,长达半个月的假期,望回到老家中,在无电脑无网络的日子里,能有更多时间陪伴年迈的父母亲. 今天学习jQuery的 ...
- PGIS大数据量点位显示方案
PGIS大数据量点位显示方案 问题描述 PGIS在地图上显示点位信息时,随点位数量的增加浏览器响应速度会逐渐变慢,当同时显示上千个点时浏览器会变得非常缓慢,以下是进行的测试: 测试环境: 服务器: C ...
- 关于UIImageView的显示问题——居中显示或者截取图片的中间部分显示
我们都知道在ios中,每一个UIImageView都有他的frame大小,但是如果图片的大小和这个frame的大小不符合的时候会怎么样呢?在默认情况,图片会被压缩或者拉伸以填满整个区域. 通过查看UI ...
- 利用 :before 特性实现图片按比例显示
好吧,想不到自称布局小沙弥的我会被图片按比例显示给尴尬到. 设计师跟我说,这里的图要按 750x330 的,好吧,但这图是屏宽呀,屏幕宽度会变化的,那高度也会不定咯, 要么裁图片(工作量大),要么给定 ...
- WPF图片浏览器(显示大图、小图等)
原文:WPF图片浏览器(显示大图.小图等) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshubo1989/article/details ...
随机推荐
- 【学习笔记】状压DP
状态压缩DP 对于一个集合,他一有\(2^n\)个子集,而状态压缩就是枚举这些子集,每一个状态就是一个由\(01\)构成的集合,如果为\(0\)就表示不选当前的元素,否则就表示选.因为状态压缩将每一个 ...
- Spring —— 依赖自动装配
依赖自动装配 IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配 自动装配方式 按类型(常用) 按名称 按构造方法 不启用自动装配 注意: 自动装配用于引 ...
- 【QT性能优化】QT性能优化之QT6框架高性能网络编程框架实现百万TCP长连接网络服务器:QT是否适合做高性能网络应用?补天云这个视频告诉你在大厂Linux云服务器上的实测结果
QT性能优化之QT6框架高性能网络编程框架实现百万TCP长连接网络服务器 Ø 简介 本文作者编写了一套基于QT的TCP网络服务器程序和基于QT的TCP客户端程序,在某大厂的云服务器上进行了C1000K ...
- ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)
名词缩写 ASID:Address Space ID 地址空间标识符 CD:Context Descriptor: 上下文描述符: CTP:Context-table pointer 上下文表指针 E ...
- 2022年 GOPS 全球运维大会(上海站)资料分享
2022年 GOPS 全球运维大会(上海站)主题为"XOps 风向标",共分为16个专场,主要侧重方向是运维.DevOps.AIOps.DevSecOps.云原生.研发效能.可观测 ...
- 玩玩虚拟化-KVM
1.讲在前面(玩这个的心历路程) 最近一段时间想玩一些集群之类的东西,学习搞一下K8s,集群啥的,但是我没有多台服务器,如果购买云服务器成本太高,后来想到了买台台式机弄点虚拟机来玩,于是我就在某鱼上淘 ...
- 使用Swagger的好处
是一个规范和完整的框架 用于生成.描述.调用和可视化RESTful风格的Web服务 接口的文档在线自动生成 功能测试
- 13. 说一下$set,用在Vue2还是Vue3
$set 是 vue2 中对象用来追加响应式数据的方法 : 使用格式 : $set(对象 , 属性名 , 值 ) vue3中使用 proxy 替代了 Object.defineProperty 实现对 ...
- kotlin函数和Lambda表达式——>内联函数
1.内联函数 使用高阶函数会带来一些运行时的效率损失:每一个函数都是一个对象,并且会捕获一个闭包.即那些 在函数体内会访问到的变量.内存分配(对于函数对象和类)和虚拟调用会引入运行时间开销. 但是在许 ...
- 超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时
> 作者:尹珉,KubeSphere Ambassado,rKubeSphere Contributor,KubeSphere 社区用户委员会杭州站站长. 踏上 Containerd 技术之旅 ...