OpenCV训练题

一、创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张图像。
  2. 在 PyQt 的窗口中显示这张图像。
  3. 提供四个按钮(QPushButton):
  • 一个用于将图像转换为灰度图
  • 一个用于将图像恢复为原始彩色图
  • 一个用于将图像进行翻转
  • 一个用于将图像进行旋转
  • 4.当用户点击按钮时,相应地更新窗口中显示的图像。
import sys
import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton
from PyQt6 import uic# 封装一个我的窗口类
class MyWidget(QWidget):def __init__(self):super().__init__()# 通过 uic 将 ui 界面加载到程序中来ui = uic.loadUi("./form.ui", self)# 加载图像self.original_image = cv2.imread("../images/lena.png")if self.original_image is None:print("无法加载图像,请检查图像路径。")sys.exit(1)self.current_image = self.original_image.copy()self.label: QLabel = ui.labelself.btn1: QPushButton = ui.btn1self.btn2: QPushButton = ui.btn2self.btn3: QPushButton = ui.btn3self.btn4: QPushButton = ui.btn4# 显示原始图像self.display_image(self.current_image)self.label.setScaledContents(True)# 连接按钮信号和槽函数self.btn1.clicked.connect(self.convert_to_gray)self.btn2.clicked.connect(self.restore_color)self.btn3.clicked.connect(self.flip_image)self.btn4.clicked.connect(self.rotate_image)def display_image(self, image):height, width, channel = image.shapebytes_per_line = 3 * widthq_img = QImage(image.data, width, height, bytes_per_line, QImage.Format.Format_BGR888)pixmap = QPixmap.fromImage(q_img)self.label.setPixmap(pixmap)def convert_to_gray(self):self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2GRAY)self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_GRAY2BGR)self.display_image(self.current_image)def restore_color(self):self.current_image = self.original_image.copy()self.display_image(self.current_image)def flip_image(self):self.current_image = cv2.flip(self.current_image, 1)self.display_image(self.current_image)def rotate_image(self):self.current_image = cv2.rotate(self.current_image, cv2.ROTATE_90_CLOCKWISE)self.display_image(self.current_image)if __name__ == '__main__':app = QApplication(sys.argv)myWidget = MyWidget()myWidget.show()sys.exit(app.exec())

结果展示:

二、创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
  2. 提供一个滑动条(QSlider),允许用户调整图像的亮度。
  3. 当用户调整滑动条时,实时更新窗口中显示的图像亮度。
  4. 添加另一个滑动条(QSlider),允许用户调整图像的对比度。
  5. 当用户调整滚动条时,实时更新窗口中显示的图像对比度。
  6. 提供一个按钮(QPushButton),允许用户将图像保存为新的文件。
  7. 当用户点击保存按钮时,将调整后的图像保存到指定的路径,OpenCV中使用cv2.imwrite()来保存图片。
import sys
import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QFileDialog
from PyQt6 import uicclass MyWidget(QWidget):def __init__(self):super().__init__()# 通过 uic 将 ui 界面加载到程序中来ui = uic.loadUi("./form1.ui", self)self.original_image = cv2.imread("../images/lena.png")if self.original_image is None:print("无法加载图像,请检查图像路径。")sys.exit(1)self.current_image = self.original_image.copy()self.label: QLabel = ui.labelself.Slider1: QSlider = ui.Slider1self.Slider2: QSlider = ui.Slider2self.pushButton: QPushButton = ui.pushButton# 初始化滑动条范围self.Slider1.setRange(-100, 100)self.Slider2.setRange(0, 200)self.Slider1.setValue(0)self.Slider2.setValue(100)# 连接信号和槽self.Slider1.valueChanged.connect(self.adjust_brightness)self.Slider2.valueChanged.connect(self.adjust_contrast)self.pushButton.clicked.connect(self.save_image)self.display_image(self.current_image)self.label.setScaledContents(True)def display_image(self, image):height, width, channel = image.shapebytes_per_line = 3 * widthq_img = QImage(image.data, width, height, bytes_per_line, QImage.Format.Format_BGR888)pixmap = QPixmap.fromImage(q_img)self.label.setPixmap(pixmap)def adjust_brightness(self, value):# 调整亮度alpha = 1.0beta = valueself.current_image = cv2.convertScaleAbs(self.original_image, alpha=alpha, beta=beta)self.display_image(self.current_image)def adjust_contrast(self, value):# 调整对比度alpha = value / 100.0beta = 0self.current_image = cv2.convertScaleAbs(self.original_image, alpha=alpha, beta=beta)self.display_image(self.current_image)def save_image(self):# 选择保存路径file_path, _ = QFileDialog.getSaveFileName(self, "保存图像", "", "图像文件 (*.png *.jpg *.jpeg)")if file_path:try:cv2.imwrite(file_path, self.current_image)print(f"图像已保存到 {file_path}")except Exception as e:print(f"保存图像时出错: {e}")if __name__ == '__main__':app = QApplication(sys.argv)myWidget = MyWidget()myWidget.show()sys.exit(app.exec())

 结果展示:

三、创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张图像。
  2. 在 PyQt 的窗口中显示这张图像。
  3. 提供一个下拉列表(QComboBox),对图像做(模糊、锐化、边缘检测)处理:
  • 模糊——使用cv2.GaussianBlur()实现
  • 锐化——使用cv2.Laplacian()、cv2.Sobel()实现
  • 边缘检测——使用cv2.Canny()实现
  1. 当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
  2. 提供一个按钮,当用户点击按钮时,能保存调整后的图像。

import sys
import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QFileDialog, QComboBox
from PyQt6 import uic# 封装一个我的窗口类
class MyWidget(QWidget):def __init__(self):super().__init__()# 通过uic将ui界面加载到程序中来ui = uic.loadUi("./form2.ui",self)self.original_image = cv2.imread("../images/lena.png")if self.original_image is None:print("无法加载图像,请检查图像路径。")sys.exit(1)self.current_image = self.original_image.copy()self.label: QLabel = ui.labelself.comboBox:QComboBox = ui.comboBoxself.pushButton:QPushButton = ui.pushButtonself.comboBox.addItems(["原始图像","模糊处理","锐化处理","边缘检测"])self.display_image(self.current_image)self.label.setScaledContents(True)self.comboBox.currentIndexChanged.connect(self.comboBox_slot)self.pushButton.clicked.connect(self.save_image)def display_image(self, image):height, width, channel = image.shapebytes_per_line = 3 * widthq_img = QImage(image.data, width, height, bytes_per_line, QImage.Format.Format_BGR888)pixmap = QPixmap.fromImage(q_img)self.label.setPixmap(pixmap)def comboBox_slot(self):if self.comboBox.currentText() == "原始图像":self.current_image = self.original_image.copy()elif self.comboBox.currentText() == "模糊处理":self.current_image = cv2.GaussianBlur(self.original_image,(5,5),0)elif self.comboBox.currentText() == "锐化处理":laplacian = cv2.Laplacian(self.original_image,cv2.CV_64F)self.current_image = cv2.convertScaleAbs(laplacian)elif self.comboBox.currentText() == "边缘检测":# 使用 Canny 边缘检测self.current_image = cv2.Canny(self.original_image, 100, 200)# 转换为三通道图像以便显示self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_GRAY2BGR)self.display_image(self.current_image)def save_image(self):# 选择保存路径file_path, _ = QFileDialog.getSaveFileName(self, "保存图像", "", "图像文件 (*.png *.jpg *.jpeg)")if file_path:try:cv2.imwrite(file_path, self.current_image)print(f"图像已保存到 {file_path}")except Exception as e:print(f"保存图像时出错: {e}")if __name__ == '__main__':app = QApplication(sys.argv)myWidget = MyWidget()myWidget.show()sys.exit(app.exec())

结果展示:

 

四、请编写一段Python代码,实现以下功能:

  1. 读取一张二维码图片
  2. 进行二值化处理和形态学操作,获取二维码轮廓
  3. 通过轮廓外接特征检测或者多边形逼近等获取 二维码的四个点
  4. 进行透视变换,矫正二维码图像
import cv2
import numpy as npdef order_points(pts):"""对四个点进行排序:左上,右上,右下,左下"""rect = np.zeros((4, 2), dtype="float32")s = pts.sum(axis=1)rect[0] = pts[np.argmin(s)]  # 左上(x+y最小)rect[2] = pts[np.argmax(s)]  # 右下(x+y最大)diff = np.diff(pts, axis=1)rect[1] = pts[np.argmin(diff)]  # 右上(y-x最小)rect[3] = pts[np.argmax(diff)]  # 左下(y-x最大)return rect# 1. 读取图片
image = cv2.imread('../images/erwei.jpg')
image = cv2.resize(image,(0,0),fx=0.5,fy=0.5)
orig = image.copy()# 2. 预处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 形态学操作(闭运算填充内部空隙)
kernel = np.ones((3, 3), np.uint8)
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)# 3. 轮廓检测
contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 筛选最大轮廓并进行多边形逼近
max_area = 0
screen_pts = None
for cnt in contours:area = cv2.contourArea(cnt)if area < 1000:  # 过滤小面积噪声continueperi = cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)if len(approx) == 4:if area > max_area:max_area = areascreen_pts = approx.reshape(4, 2)if screen_pts is None:raise ValueError("未检测到二维码轮廓")# 4. 透视变换
rect = order_points(screen_pts)
(tl, tr, br, bl) = rect# 计算目标图像尺寸
width_a = np.linalg.norm(br - bl)
width_b = np.linalg.norm(tr - tl)
max_width = max(int(width_a), int(width_b))height_a = np.linalg.norm(tr - br)
height_b = np.linalg.norm(tl - bl)
max_height = max(int(height_a), int(height_b))# 目标点坐标
dst = np.array([[0, 0],[max_width - 1, 0],[max_width - 1, max_height - 1],[0, max_height - 1]], dtype="float32")# 计算变换矩阵并执行变换
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(orig, M, (max_width, max_height))# 显示结果
cv2.imshow("Original", orig)
cv2.imshow("Corrected QR Code", warped)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、 请编写一段Python代码,实现以下功能:

  1. 读取一张彩色图像
  2. 制作要提取颜色的掩膜
  3. 输出抠图后的前景图 和 背景图

import cv2
import numpy as npdef extract_colors(image_path):# 1. 读取彩色图像img = cv2.imread(image_path)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 2. 定义颜色范围(示例:提取红色系)# 可根据需求修改阈值范围lower_red1 = np.array([0, 43, 46])     # 红色HSV下限1upper_red1 = np.array([10, 255, 255])    # 红色HSV上限1lower_red2 = np.array([156, 43, 46])   # 红色HSV下限2(处理色相环闭合)upper_red2 = np.array([180, 255, 255])   # 红色HSV上限2# 生成掩膜mask1 = cv2.inRange(hsv, lower_red1, upper_red1)mask2 = cv2.inRange(hsv, lower_red2, upper_red2)mask = cv2.bitwise_or(mask1, mask2)# 形态学优化(填充空洞、去除噪声)kernel = np.ones((5,5), np.uint8)mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2)mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)# 3. 分割前景和背景foreground = cv2.bitwise_and(img, img, mask=mask)background = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask))# 4. 显示结果# cv2.imshow("Original", img)cv2.imshow("Foreground", foreground)cv2.imshow("Background", background)cv2.waitKey(0)cv2.destroyAllWindows()# 执行函数(替换为你的图片路径)
extract_colors("../images/redflowers.png")

 结果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv函数展示4

一、形态学操作函数 1.基本形态学操作 &#xff08;1&#xff09;cv2.getStructuringElement() &#xff08;2&#xff09;cv2.erode() &#xff08;3&#xff09;cv2.dilate() 2.高级形态学操作 &#xff08;1&#xff09;cv2.morphologyEx() 二、直方图处理函数 1.直方图…

iPhone 13P 换超容电池,一年实记的“电池循环次数-容量“柱状图

继上一篇 iPhone 13P 更换"移植电芯"和"超容电池"&#x1f50b;体验&#xff0c;详细记录了如何更换这两种电池&#xff0c;以及各自的优略势对比。 一晃一年过去&#xff0c;时间真快&#xff0c;这次分享下记录了使用超容电池的 “循环次数 - 容量(mAh)…

基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践

基于 pnpm Monorepo Turbo 无界微前端 Vite 的企业级前端工程实践 一、技术演进&#xff1a;为什么引入 Vite&#xff1f; 在微前端与 Monorepo 架构落地后&#xff0c;构建性能成为新的优化重点&#xff1a; Webpack 构建瓶颈&#xff1a;复杂配置导致开发启动慢&#…

(五)机器学习---决策树和随机森林

在分类问题中还有一个常用算法&#xff1a;就是决策树。本文将会对决策树和随机森林进行介绍。 目录 一.决策树的基本原理 &#xff08;1&#xff09;决策树 &#xff08;2&#xff09;决策树的构建过程 &#xff08;3&#xff09;决策树特征选择 &#xff08;4&#xff0…

Vue3使用AntvG6写拓扑图,可添加修改删除节点和边

npm安装antv/g6 npm install antv/g6 --save 上代码 <template><div id"tpt1" ref"container" style"width: 100%;height: 100%;"></div> </template><script setup>import { Renderer as SVGRenderer } from …

Arduino编译和烧录STM32——基于J-link SWD模式

一、安装Stm32 Arduino支持 在arduino中添加stm32的开发板地址&#xff1a;https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json 安装stm32开发板支持 二、安装STM32CubeProgrammer 从stm32网站中安装&#xff1a;https://ww…

智慧城市气象中台架构:多源天气API网关聚合方案

在开发与天气相关的应用时&#xff0c;获取准确的天气信息是一个关键需求。万维易源提供的“天气预报查询”API为开发者提供了一个高效、便捷的工具&#xff0c;可以通过简单的接口调用查询全国范围内的天气信息。本文将详细介绍如何使用该API&#xff0c;以及其核心功能和调用…

Vue 组件化开发

引言 在当今的 Web 开发领域&#xff0c;构建一个功能丰富且用户体验良好的博客是许多开发者的目标。Vue.js 作为一款轻量级且高效的 JavaScript 框架&#xff0c;其组件化开发的特性为我们提供了一种优雅的解决方案。通过将博客拆分成多个独立的组件&#xff0c;我们可以提高代…

Deno 统一 Node 和 npm,既是 JS 运行时,又是包管理器

Deno 是一个现代的、一体化的、零配置的 JavaScript 运行时、工具链&#xff0c;专为 JavaScript 和 TypeScript 开发设计。目前已有数十万开发者在使用 Deno&#xff0c;其代码仓库是 GitHub 上 star 数第二高的 Rust 项目。 Stars 数102620Forks 数5553 主要特点 内置安全性…

应用篇02-镜头标定(上)

本节主要介绍相机的标定方法&#xff0c;包括其内、外参数的求解&#xff0c;以及如何使用HALCON标定助手实现标定。 计算机视觉——相机标定(Camera Calibration)_摄像机标定-CSDN博客 1. 原理 本节介绍与相机标定相关的理论知识&#xff0c;不一定全&#xff0c;可以参考相…

PG CTE 递归 SQL 翻译为 达梦版本

文章目录 PG SQLDM SQL总结 PG SQL with recursive result as (select res_id,phy_res_code,res_name from tbl_res where parent_res_id (select res_id from tbl_res where phy_res_code org96000#20211203155858) and res_type_id 1 union all select t1.res_id, t1.p…

C# Where 泛型约束

在C#中&#xff0c;Where关键字主要有两种用途 1、在泛型约束中限制类型参数 2、在LINQ查询中筛选数据 本文主要介绍where关键字在在泛型约束中的使用 泛型定义中的 where 子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束。通过使用 where 关键字和…

《MySQL:MySQL表的约束-主键/复合主键/唯一键/外键》

表的约束&#xff1a;表中一定要有各种约束&#xff0c;通过约束&#xff0c;让未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段&#xff0c;倒逼程序员插入正确的数据。即&#xff0c;站在mysql的视角&#xff0c;凡是插入进来的数据&#xff0c;都是符合数据约…

Qt 创建QWidget的界面库(DLL)

【1】新建一个qt库项目 【2】在项目目录图标上右击&#xff0c;选择Add New... 【3】选择模版&#xff1a;Qt->Qt设计师界面类&#xff0c;选择Widget&#xff0c;填写界面类的名称、.h .cpp .ui名称 【4】创建C调用接口&#xff08;默认是创建C调用接口&#xff09; #ifnd…

汽车免拆诊断案例 | 2011款雪铁龙世嘉车刮水器偶尔自动工作

故障现象 一辆2011款雪铁龙世嘉车&#xff0c;搭载1.6 L 发动机&#xff0c;累计行驶里程约为19.8万km。车主反映&#xff0c;该车刮水器偶尔会自动工作&#xff0c;且前照灯偶尔会自动点亮。 故障诊断 接车后试车发现&#xff0c;除了上述故障现象以外&#xff0c;当用遥控器…

【Linux】NAT、代理服务、内网穿透

NAT、代理服务、内网穿透 一. NAT1. NAT 技术2. NAT IP 转换过程3. NAPT 技术4. NAT 技术的缺陷 二. 代理服务器1. 正向代理2. 反向代理3. NAT 和代理服务器 内网穿透内网打洞 一. NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&a…

MobaXterm连接Ubuntu(SSH)

1.查看Ubuntu ip 打开终端,使用指令 ifconfig 由图可知ip地址 2.MobaXterm进行SSH连接 点击session,然后点击ssh,最后输入ubuntu IP地址以及用户名

Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践

Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践 前言 在开发和运维 Java 应用的过程中&#xff0c;远程诊断和调试是一个不可或缺的需求。尤其是当生产环境出现问题时&#xff0c;能够快速定位并解决这些问题至关重要。Arthas 是阿里巴巴开源的一款强大的 Java…

图像预处理-添加水印

一.ROI切割 类似裁剪图片&#xff0c;但是原理是基于Numpy数组的切片操作(ROI数组切片是会修改原图数据的)&#xff0c;也就是说这个“裁剪”不是为了保存“裁剪”部分&#xff0c;而是为了方便修改等处理。 import cv2 as cv import numpy as npimg cv.imread(../images/dem…

数据结构——八大排序算法

排序在生活中应用很多&#xff0c;对数据排序有按成绩&#xff0c;商品价格&#xff0c;评论数量等标准来排序。 数据结构中有八大排序&#xff0c;插入、选择、快速、归并四类排序。 目录 插入排序 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare…