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.pswp.cn/news/902266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902266.shtml
英文地址,請注明出處:http://en.pswp.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…