Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片

您所在的位置:网站首页 opencv显示图片太大 Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片

Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片

2023-12-03 04:56| 来源: 网络整理| 查看: 265

Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片 一、实现目标二、实现背景三、实现方法四、运行环境五、运行代码六、运行结果七、不足八、参考

一、实现目标

  在OpenCV显示比窗口更大的图片,可通过右侧的垂直滚动条和底部的水平滚动条移动图片来显示全图。 在这里插入图片描述

二、实现背景

  在OpenCV中,虽然有cv2.getTrackbarPos() 函数,但其作用主要是用作动态调节参数的控件,更准确名称应为滑动条,而非作为滚动条控件使用。经查询发现OpenCV并没有滚动条控件,其对于大于显示窗口的图片来说,OpenCv只能显示原比例图片的部分内容或者缩放后的图片,而无法显示原比例图片的全部内容。

三、实现方法

  1. 自己在OpenCv显示窗口画出滚动条,并通过鼠标事件实现其功能(在此详讲的,如果你一定要使用OpenCV界面的话);   2. 使用其它界面工具如QT等的滚动条控件来实现图片(此方法另谈)。

四、运行环境

  1. 在windows下已安装Python(必须的,我使用的是python3.7);   2. 安装PyCharm(方便编程调试)   3. 安装opencv-python(在python下安装配置OpenCV)

五、运行代码 import cv2 #鼠标事件 def mouse(event, x, y, flags, param): global flag, horizontal, vertical, flag_hor, flag_ver, dx, dy, sx, sy, dst, x1, y1, x2, y2, x3, y3, f1, f2 global zoom, scroll_har, scroll_var, img_w, img_h, img, dst1, win_w, win_h, show_w, show_h if event == cv2.EVENT_LBUTTONDOWN: # 左键点击 if flag == 0: if horizontal and 0 < x < win_w and win_h - scroll_w < y < win_h: flag_hor = 1 # 鼠标在水平滚动条上 elif vertical and win_w - scroll_w < x < win_w and 0 < y < win_h: flag_ver = 1 # 鼠标在垂直滚动条上 if flag_hor or flag_ver: flag = 1 # 进行滚动条垂直 x1, y1, x2, y2, x3, y3 = x, y, dx, dy, sx, sy # 使鼠标移动距离都是相对于初始滚动条点击位置,而不是相对于上一位置 elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): # 按住左键拖曳 if flag == 1: if flag_hor: w = (x - x1)/2 # 移动宽度 dx = x2 + w * f1 # 原图x if dx < 0: # 位置矫正 dx = 0 elif dx > img_w - show_w: dx = img_w - show_w sx = x3 + w # 滚动条x if sx < 0: # 位置矫正 sx = 0 elif sx > win_w - scroll_har: sx = win_w - scroll_har if flag_ver: h = y - y1 # 移动高度 dy = y2 + h * f2 # 原图y if dy < 0: # 位置矫正 dy = 0 elif dy > img_h - show_h: dy = img_h - show_h sy = y3 + h # 滚动条y if sy < 0: # 位置矫正 sy = 0 elif sy > win_h - scroll_var: sy = win_h - scroll_var dx, dy = int(dx), int(dy) img1 = img[dy:dy + show_h, dx:dx + show_w] # 截取显示图片 print(dy, dy + show_h, dx, dx + show_w) dst = img1.copy() elif event == cv2.EVENT_LBUTTONUP: # 左键释放 flag, flag_hor, flag_ver = 0, 0, 0 x1, y1, x2, y2, x3, y3 = 0, 0, 0, 0, 0, 0 elif event == cv2.EVENT_MOUSEWHEEL: # 滚轮 if flags > 0: # 滚轮上移 zoom += wheel_step if zoom > 1 + wheel_step * 20: # 缩放倍数调整 zoom = 1 + wheel_step * 20 else: # 滚轮下移 zoom -= wheel_step if zoom < wheel_step: # 缩放倍数调整 zoom = wheel_step zoom = round(zoom, 2) # 取2位有效数字 img_w, img_h = int(img_original_w * zoom), int(img_original_h * zoom) # 缩放都是相对原图,而非迭代 img_zoom = cv2.resize(img_original, (img_w, img_h), interpolation=cv2.INTER_AREA) horizontal, vertical = 0, 0 if img_h win_h: horizontal, vertical = 1, 1 scroll_har, scroll_var = win_w * show_w / img_w, win_h * show_h / img_h f1, f2 = (img_w - show_w) / (win_w - scroll_har), (img_h - show_h) / (win_h - scroll_var) elif img_w > win_w and img_h


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3