opencv-如何获取图像区域特定像素区域大小

news/2024/10/4 6:59:07/

需求

通过鼠标框选某个区域,返回这个区域的像素大小。

源码

# e:path\to\cal_rectangle_area.py
import cv2  
import numpy as np  # 初始化变量
image = cv2.imread('./vlcsnap-2024-09-25-10h51m27s007.png')  
if image is None:  print("Error: Image could not be read.")  exit()  # 窗口和缩放参数
scale = 1.0
pan_x, pan_y = 0, 0
rectangles = []  # 存储所有矩形框
refPt = []def draw_rectangle(event, x, y, flags, param):  global refPt  if event == cv2.EVENT_LBUTTONDOWN:  # 计算真实坐标real_x = int((x + pan_x) / scale)real_y = int((y + pan_y) / scale)print(f"Mouse Position (Real): ({real_x}, {real_y})")refPt = [[x, y]]  elif event == cv2.EVENT_LBUTTONUP and len(refPt) == 1:  refPt.append([x, y])  rectangles.append(refPt)  # 保存矩形框cv2.rectangle(image, tuple(refPt[0]), tuple(refPt[1]), (0, 255, 0), 2)  cv2.imshow('image', image)  print(f"Width: {abs(refPt[1][0] - refPt[0][0])}, Height: {abs(refPt[1][1] - refPt[0][1])}")  refPt = []  def update_image():# 应用缩放和平移h, w = image.shape[:2]new_image = cv2.resize(image, (int(w * scale), int(h * scale)))new_image = new_image[pan_y:pan_y + int(h * scale), pan_x:pan_x + int(w * scale)]# 绘制所有矩形框for rect in rectangles:cv2.rectangle(new_image, tuple(rect[0]), tuple(rect[1]), (0, 255, 0), 2)cv2.imshow('image', new_image)def crop_and_save_image(x, y):# 裁剪图像h, w = image.shape[:2]x1 = max(x - 320, 0)  # 640/2y1 = max(y - 320, 0)  # 640/2x2 = min(x + 320, w)  # 640/2y2 = min(y + 320, h)  # 640/2cropped_image = image[y1:y2, x1:x2]cv2.imwrite('cropped_image.png', cropped_image)  # 保存裁剪后的图像print(f"Cropped image saved as 'cropped_image.png'.")# 设置鼠标回调函数  
cv2.namedWindow('image')  
cv2.setMouseCallback('image', draw_rectangle)  # 显示图像直到有键被按下  
while True:  update_image()  # 更新显示的图像key = cv2.waitKey(1) & 0xFF  if key == ord('q'):  break  elif key == ord('+'):  # 缩放放大scale *= 1.1elif key == ord('-'):  # 缩放缩小scale /= 1.1elif key == ord('w'):  # 向上移动pan_y -= 10elif key == ord('s'):  # 向下移动pan_y += 10elif key == ord('a'):  # 向左移动pan_x -= 10elif key == ord('d'):  # 向右移动pan_x += 10elif key == ord('c'):  # 输入坐标裁剪图像x = int(input("Enter x coordinate: "))y = int(input("Enter y coordinate: "))crop_and_save_image(x, y)cv2.destroyAllWindows()


http://www.ppmy.cn/news/1533767.html

相关文章

自建RustDesk服务器:详细步骤与操作指南

在远程办公和协作日益普及的今天,远程桌面软件成为了不可或缺的工具。然而,许多知名的远程桌面软件,在免费使用一段时间后,会通过限制连接数量、时长或在特定网络环境下的可用性来促使用户付费升级,而且其会员非常昂贵…

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版

推荐:《算法竞赛》,算法竞赛大全书,网购:京东 天猫  当当 文章目录 《蓝桥杯算法入门》内容简介本书读者对象作者简介联系与交流《蓝桥杯算法入门 C/C》版目录 《蓝桥杯算法入门 Java》版目录 《蓝桥杯算法入门 Python》版目录 …

通信工程学习:什么是TFTP简单文件传输协议

TFTP:简单文件传输协议 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种轻量级的文件传输协议,主要用于在计算机网络中传输小型文件。以下是对TFTP的详细解释: 一、TFTP简单文件传输协议的定…

OLED移植

一、在D盘中找到OLED文件包 二、新建一个HAL库工程 只需要配好RCC和SYS以及时钟树就可以,不开启任何引脚 三、移植文件 把文件放在Core->Src里面 四、在Kile5中添加文件 五、注意 (1)下载的时候要开启Rsset and Run 不然下载不进程序 &a…

django drf 统一Response格式

场景 需要将响应体按照格式规范返回给前端。 例如: 响应体中包含以下字段: {"result": true,"data": {},"code": 200,"message": "ok","request_id": "20cadfe4-51cd-42f6-af81-0…

2025秋招内推--招联金融

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

【MySQL】MySQL库的操作

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:掌握对库操作的语句并能熟练掌握。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自&#x…

DOM元素导出图片与PDF:多种方案对比与实现

背景 在日常前端开发中,经常会有把页面的 DOM 元素作为 PNG 或者 PDF 下载到本地的需求。例如海报功能,简历导出功能等等。在我们自家的产品「代码小抄」中,就使用了 html2canvas 来实现代码片段导出为图片: 是不是还行&#xff…