起因:最近对图片进行截取矩形区域操作时,发现了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给图片加滑动条调节窗口大小相关推荐

  1. 【opencv3】滑动条调节RGB颜色阈值并输出滑动条的值

    一.实现目标 首先对图像 RGB 色彩空间进行分割,然后根据分割出来的各个通道的图像进行二值化处理,通过滑动条(cvCreateTrackbar)可以调节二值化的阈值. 二.程序1 // 利用滑动条调 ...

  2. js怎么给div加滑动条 vue给弹出层加滑动条(一分钟学会用js加滚动条)

    @[TOC](怎么给div加滑动条 给弹出层加滑动条(一分钟学会js加滚动条)) 给div加滑动条 给需要滑动条的div加一个样式 加一个高度,加一个overflow:auto; overflow:a ...

  3. python opencv Intel Realsense 使用滑动条调整图片的曝光率

    # -*- coding: utf-8 -*- """ @File : 200113:测试跟踪条tracebackbar().py @Time : 2020/1/13 9 ...

  4. openCV给图片加坐标轴

    为了给一张图片加坐标轴,调用openCV,用了两天的时间写了个简化版的版本,直到我看到了这个: 点击打开链接 以及这个:http://answers.opencv.org/question/73233 ...

  5. OpenCV鼠标事件和滑动条事件

    鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成. void your_mouse_callback(int event, int x, int y, int flags, void* param ...

  6. OpenCV————鼠标绘制和滑动条

    导入包 import cv2 import numpy as np 可以通过下面的代码来查看所有的鼠标事件函数 events=[i for i in dir(cv2) if 'EVENT' in i] ...

  7. PyQt使用中遇到的若干问题(1)(版本选择,安装,显示图片,滑动条,窗口一闪而过)

    最近几天在需要做个人脸检索的demo,开始在考虑使用C或者Python,但是由于我之前的实验使用的是基于Python的Keras框架,所以选择使用Python来做GUI,Python的GUI工具很多, ...

  8. 【乐畅】工作积累 ---- 调节音量大小 (滑动条调节音量大小并保存起来 )

    cocos2dx 的音量的大小的范围是 0.0f ~ 1.0f 1 // 获取音量大小 2 float musicVolume = getMusicVolume(); 3 float effectVo ...

  9. php框架加滑动条,IOS_iOS实现双向滑动条效果,最近做项目,碰到一种双向滑 - phpStudy...

    iOS实现双向滑动条效果 最近做项目,碰到一种双向滑动条,自己实现了一下,随便写一下思路,方便以后开发,避免重复写代码,以后粘贴就行了.封装了一下,代码如下: #import typedef NSSt ...

最新文章

  1. CVPR 2020 Oral | 人脸识别Loss新突破: 旷视提出Circle Loss,革新深度特征学习范式...
  2. layer.tips定义弹出的宽度
  3. 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )
  4. 博士申请 | 普渡大学郭齐教授组招收计算成像全奖博士生
  5. C#使用Aspose.Words操作word文档(利用模板2)
  6. python xmlns 解析_使用python读取标记中包含xmlns的XML文件
  7. 多继承 , 组合 , 菱形继承 , 接口 , 抽象 , 鸭子类型
  8. 用计算机看手机照片大小,手机怎么知道照片多少k
  9. snipaste如何滚动截图_3款工具满足你对截图软件的所有想象
  10. TMS570-4-RTI_DWD看门狗
  11. 相干接收机matlab仿真,基于DP-16QAM的400Gbit/s集成相干接收机关键技术研究
  12. 微信小程序跳转其他外部网站上
  13. 如何将caj转换成word?caj转Word工具
  14. 微信小程序蓝牙连接小票打印机
  15. Dispose 和 GC 注意点
  16. 软件测试面试宝典(2022面试预测)——软件测试大厂试题
  17. 功能覆盖率与代码覆盖率区别
  18. 如果楼市崩盘我们怎么活?(续集)
  19. python爬取网络小说_Python爬取起点中文网月票榜前500名网络小说介绍
  20. 西湖,一首荡漾千年的华章

热门文章

  1. 1 C语言的基本知识
  2. 微前端:使用qiankun框架从 0-1 搭建vue构成微前端项目
  3. GBase 8a MPP使用时 数据库基础问题之管理工具三
  4. 使用百度地图POI爬取需要的数据
  5. 奇偶校验,异或校验,和校验,nios串口校验
  6. 博学谷java百度网盘_博学谷javaee在线就业班2020网盘
  7. 我的世界1.12.2java下载_我的世界1.12.2
  8. java多线程系列八之多线程之间的交互:线程阀
  9. 呕心沥血梳理C++新标准超好用的新特性(实战必备)
  10. 支持OneNote for Window10代码高亮工具