opencv给图片加滑动条调节窗口大小
起因:最近对图片进行截取矩形区域操作时,发现了opencv一个很蛋痛的地方,使用imshow()函数展示图片的时候,一旦图片的分辨率过高,就不能完全显示。要是调整参数为WINDOWSIZE_NORMAL的话,截取出来的矩形区域和原图并不是一一对应的。使用resize函数的话,先缩小在放大又会使图片变得异常模糊。只好上网查了一下给图片加上滑动条的文章,然而只找到了opecv2写的函数,现用opencv4重写如下。
目的:给分辨率过大的图片加上滑动条。
原理:截取原图中符合窗口大小的部分并在窗口中显示
代码:
#include<opencv.hpp>
#include<iostream>using namespace cv;
using namespace std;int h_x=0, v_y=0,d_x=0,d_y=0; //记录滑动条变化值,以及保存当前值
Rect v_bar, h_bar;
Point start; //移动鼠标时的基点,使用了全局变量以使得滑动条的位置可以被记录下来。也可设为局部的静态变量
bool x_change = false;
bool y_change = false; //判断是否改变void on_mouse(int event, int x, int y, int flags, void* param);
void draw_scrolls(Mat src_img, const char* title, int width = 500, int height = 700); //后两个参数设置窗口的默认大小int main()
{const char* title = "source";Mat srcimg = imread("E:\\material\\shaoyun.jpg");namedWindow(title, 1);setMouseCallback(title, on_mouse);while (true){char c = waitKey(10);draw_scrolls(srcimg,title);if (c == ' ')break;}}void draw_scrolls(Mat src_img, const char* title, int width, int height)
{Mat temp_img, src_rect, temp_rect;Mat src_roi;Rect v_rect,h_rect;int img_width, img_height; //img的width和heightint win_width, win_height; //window的width和heightint show_width, show_height; //窗口中图片的width和heightint bar_width=25; //滑动条的宽度double scale_h, scale_w; //img和window的width,height之比int img_y=0,img_x=0; //上下滑动后截取图片左上顶点的y值,左右滑动后截取图片左上角x值img_width = src_img.cols;img_height = src_img.rows;win_width=show_width = min(img_width,width);win_height=show_height = min(img_height,height);scale_h = (double)img_height / height;scale_w = (double)img_width / width;//高度过高需要加竖直滑动if (scale_h>1){win_width = img_width > width ? width + bar_width : img_width + bar_width;show_width = win_width - bar_width;}//宽度过宽需要加水平滑动if (scale_w>1){win_height = img_height > height ? height + bar_width : img_height + bar_width;show_height = win_height - bar_width;}temp_img = Mat::zeros(Size(win_width, win_height), CV_8UC3);if (scale_h > 1){v_y += d_y;d_y = 0;v_y = v_y < 0 ? 0 : (v_y > (int)((1 - 1 / scale_h) * win_height) ? (int)((1 - 1 / scale_h) * win_height) : v_y);img_y = (int)(v_y * img_height / win_height);//img_y = (int)(v_y / ((1-1/scale_h) * win_height) * (1 - 1 / scale_h)*img_height)的简化v_rect = Rect(show_width + 1, 0, bar_width, win_height); //竖直滑动条底层v_bar = Rect(show_width + 1, v_y, bar_width, (int)((double)win_height / scale_h)); //竖直滑动条rectangle(temp_img, v_rect, Scalar::all(0), -1);rectangle(temp_img, v_bar, Scalar::all(255), -1);}if (scale_w > 1){h_x+=d_x;d_x = 0;h_x = h_x < 0 ? 0 : (h_x > (int)((1 - 1 / scale_w) * win_width) ? (int)((1 - 1 / scale_w) * win_width) : h_x);img_x = (int)(h_x * img_width / win_width); //同上h_rect = Rect(0, show_height + 1, win_width, bar_width); //水平滑动条底层h_bar = Rect(h_x, show_height + 1, (int)((double)win_width / scale_w), bar_width); //水平滑动条rectangle(temp_img, h_rect, Scalar::all(0), -1);rectangle(temp_img, h_bar, Scalar::all(255), -1);}temp_rect = temp_img(Rect(0, 0, show_width, show_height)); //窗口显示图片部分src_rect = src_img(Rect(img_x, img_y, show_width, show_height)); //原图截取部分src_rect.copyTo(temp_rect);imshow(title, temp_img);}void on_mouse(int event, int x, int y, int flags, void* param)
{Point curse = Point(x, y);Point now;//点击竖直滑动条if (v_bar.contains(curse)){if (event == EVENT_LBUTTONDOWN){start = Point(x, y);y_change = true;}}//点击水平滑动条if (h_bar.contains(curse)){ if (event == EVENT_LBUTTONDOWN){start = Point(x, y);x_change = true;}}//拖动if (event == EVENT_MOUSEMOVE){now = Point(x, y);if (y_change){d_y = now.y - start.y;start = now;}if (x_change){d_x = now.x - start.x;start = now;}}if (event == EVENT_LBUTTONUP){x_change = y_change = false;}
}
原图:
效果图:
————————————————
版权声明:本文为CSDN博主「三更打雨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Dr_maker/article/details/100833890
opencv给图片加滑动条调节窗口大小相关推荐
- 【opencv3】滑动条调节RGB颜色阈值并输出滑动条的值
一.实现目标 首先对图像 RGB 色彩空间进行分割,然后根据分割出来的各个通道的图像进行二值化处理,通过滑动条(cvCreateTrackbar)可以调节二值化的阈值. 二.程序1 // 利用滑动条调 ...
- js怎么给div加滑动条 vue给弹出层加滑动条(一分钟学会用js加滚动条)
@[TOC](怎么给div加滑动条 给弹出层加滑动条(一分钟学会js加滚动条)) 给div加滑动条 给需要滑动条的div加一个样式 加一个高度,加一个overflow:auto; overflow:a ...
- python opencv Intel Realsense 使用滑动条调整图片的曝光率
# -*- coding: utf-8 -*- """ @File : 200113:测试跟踪条tracebackbar().py @Time : 2020/1/13 9 ...
- openCV给图片加坐标轴
为了给一张图片加坐标轴,调用openCV,用了两天的时间写了个简化版的版本,直到我看到了这个: 点击打开链接 以及这个:http://answers.opencv.org/question/73233 ...
- OpenCV鼠标事件和滑动条事件
鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成. void your_mouse_callback(int event, int x, int y, int flags, void* param ...
- OpenCV————鼠标绘制和滑动条
导入包 import cv2 import numpy as np 可以通过下面的代码来查看所有的鼠标事件函数 events=[i for i in dir(cv2) if 'EVENT' in i] ...
- PyQt使用中遇到的若干问题(1)(版本选择,安装,显示图片,滑动条,窗口一闪而过)
最近几天在需要做个人脸检索的demo,开始在考虑使用C或者Python,但是由于我之前的实验使用的是基于Python的Keras框架,所以选择使用Python来做GUI,Python的GUI工具很多, ...
- 【乐畅】工作积累 ---- 调节音量大小 (滑动条调节音量大小并保存起来 )
cocos2dx 的音量的大小的范围是 0.0f ~ 1.0f 1 // 获取音量大小 2 float musicVolume = getMusicVolume(); 3 float effectVo ...
- php框架加滑动条,IOS_iOS实现双向滑动条效果,最近做项目,碰到一种双向滑 - phpStudy...
iOS实现双向滑动条效果 最近做项目,碰到一种双向滑动条,自己实现了一下,随便写一下思路,方便以后开发,避免重复写代码,以后粘贴就行了.封装了一下,代码如下: #import typedef NSSt ...
最新文章
- CVPR 2020 Oral | 人脸识别Loss新突破: 旷视提出Circle Loss,革新深度特征学习范式...
- layer.tips定义弹出的宽度
- 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )
- 博士申请 | 普渡大学郭齐教授组招收计算成像全奖博士生
- C#使用Aspose.Words操作word文档(利用模板2)
- python xmlns 解析_使用python读取标记中包含xmlns的XML文件
- 多继承 , 组合 , 菱形继承 , 接口 , 抽象 , 鸭子类型
- 用计算机看手机照片大小,手机怎么知道照片多少k
- snipaste如何滚动截图_3款工具满足你对截图软件的所有想象
- TMS570-4-RTI_DWD看门狗
- 相干接收机matlab仿真,基于DP-16QAM的400Gbit/s集成相干接收机关键技术研究
- 微信小程序跳转其他外部网站上
- 如何将caj转换成word?caj转Word工具
- 微信小程序蓝牙连接小票打印机
- Dispose 和 GC 注意点
- 软件测试面试宝典(2022面试预测)——软件测试大厂试题
- 功能覆盖率与代码覆盖率区别
- 如果楼市崩盘我们怎么活?(续集)
- python爬取网络小说_Python爬取起点中文网月票榜前500名网络小说介绍
- 西湖,一首荡漾千年的华章
热门文章
- 1 C语言的基本知识
- 微前端:使用qiankun框架从 0-1 搭建vue构成微前端项目
- GBase 8a MPP使用时 数据库基础问题之管理工具三
- 使用百度地图POI爬取需要的数据
- 奇偶校验,异或校验,和校验,nios串口校验
- 博学谷java百度网盘_博学谷javaee在线就业班2020网盘
- 我的世界1.12.2java下载_我的世界1.12.2
- java多线程系列八之多线程之间的交互:线程阀
- 呕心沥血梳理C++新标准超好用的新特性(实战必备)
- 支持OneNote for Window10代码高亮工具