OpenCV 核心技術:顏色檢測與幾何變換實戰

在計算機視覺任務中,顏色空間轉換圖像幾何變換是兩大基礎且高頻的操作 —— 前者用于精準分割特定顏色目標(如交通信號燈、物體追蹤),后者用于調整圖像的尺寸、位置和視角(如文檔矯正、圖像拼接)。本文將通過 6 段實戰代碼,系統解析 HSV 顏色檢測、圖像縮放、平移、旋轉、仿射變換和透視變換的原理與應用。

一、HSV 顏色空間:精準檢測特定顏色(以藍色為例)

RGB(或 BGR)顏色空間雖直觀,但受光照影響大(如亮度變化會導致像素值劇烈波動),而HSV 顏色空間(色相 H、飽和度 S、明度 V)更符合人眼對顏色的感知,且能有效分離顏色信息與亮度信息,是顏色分割的首選。

1. 代碼實現:實時檢測攝像頭中的藍色物體

import cv2
import numpy as np# 打開默認攝像頭
cap = cv2.VideoCapture(0)while True:# 讀取一幀圖像ret, frame = cap.read()if not ret:  # 防止攝像頭讀取失敗break# 1. 將BGR圖像轉換為HSV圖像(OpenCV默認BGR格式)hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 2. 定義HSV空間中藍色的范圍(需根據實際場景調試)# H:色相(0-179),S:飽和度(0-255),V:明度(0-255)lower_blue = np.array([110, 50, 50])   # 藍色下限upper_blue = np.array([130, 255, 255]) # 藍色上限# 3. 生成顏色掩碼:在范圍內的像素設為255(白色),否則為0(黑色)mask = cv2.inRange(hsv, lower_blue, upper_blue)# 4. 掩碼與原圖像進行按位與:只保留原圖像中藍色區域res = cv2.bitwise_and(frame, frame, mask=mask)# 顯示結果cv2.imshow('Original Frame', frame)  # 原圖像cv2.imshow('Blue Mask', mask)        # 顏色掩碼cv2.imshow('Detected Blue', res)     # 檢測結果# 按q鍵退出循環if cv2.waitKey(1) & 0xFF == ord('q'):break# 釋放資源
cap.release()
cv2.destroyAllWindows()

2. 關鍵技術解析

函數 / 操作作用與原理
cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)將 BGR 格式轉換為 HSV 格式,分離顏色(H)、純度(S)、亮度(V)信息,避免光照干擾。
cv2.inRange(hsv, lower, upper)生成二值掩碼:篩選出 HSV 值在[lower, upper]范圍內的像素,實現顏色分割。
cv2.bitwise_and(frame, frame, mask=mask)按位與操作:僅保留原圖像中掩碼為 255(白色)的區域,即目標顏色區域。

3. 實用技巧

  • HSV 范圍調試:不同場景下顏色的 HSV 范圍不同,可通過「先獲取目標顏色的 HSV 值」再微調范圍(如用cv2.cvtColor轉換單個像素的 BGR 到 HSV)。
  • 抗干擾優化:可對掩碼進行形態學操作(如cv2.erode腐蝕、cv2.dilate膨脹),去除小噪聲點。

二、圖像縮放:調整圖像尺寸

圖像縮放是預處理的基礎操作,用于統一圖像尺寸(如神經網絡輸入要求固定大小)或優化顯示效果。OpenCV 提供兩種縮放方式:按比例縮放指定目標尺寸縮放

1. 代碼實現:兩種縮放方式

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('ocv01.jpg')
if img is None:  # 防止圖像讀取失敗print("無法讀取圖像")exit()# 方式1:按比例縮放(fx=水平比例,fy=垂直比例)
# interpolation=INTER_CUBIC:雙三次插值(放大時效果最優,速度較慢)
res1 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)# 方式2:指定目標尺寸(寬,高)
height, width = img.shape[:2]  # 獲取原圖像尺寸(高,寬)
res2 = cv2.resize(img, (2*width, 2*height), interpolation=cv2.INTER_CUBIC)# 顯示對比
while True:cv2.imshow('Original (640x480)', img)    # 原圖像cv2.imshow('Scaled by Ratio (1280x960)', res1)  # 按比例放大2倍cv2.imshow('Scaled by Size (1280x960)', res2)   # 按指定尺寸放大2倍if cv2.waitKey(1) & 0xFF == ord('q'):breakcv2.destroyAllWindows()

2. 插值方法選擇

縮放的核心是「插值算法」(通過已有像素計算新像素值),需根據縮放方向選擇:

插值方法適用場景特點
cv2.INTER_NEAREST快速預覽、對精度要求低速度最快,效果最差(鋸齒)
cv2.INTER_LINEAR默認選項速度與效果平衡
cv2.INTER_CUBIC圖像放大(如 4K 放大到 8K)效果最優,速度較慢
cv2.INTER_AREA圖像縮小(如 1080P 縮到 720P)保留細節,避免模糊

三、圖像幾何變換:改變位置與視角

幾何變換通過矩陣運算改變圖像像素的空間位置,包括平移、旋轉、仿射變換、透視變換,適用于圖像矯正、視角轉換等場景。

1. 平移:沿 x/y 軸移動圖像

平移是最簡單的幾何變換,通過「平移矩陣」實現像素位置偏移。

代碼實現:
import cv2
import numpy as npcap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:break# 1. 定義平移矩陣:[[1,0,dx], [0,1,dy]],dx=水平偏移,dy=垂直偏移# 示例:向右偏移100像素,向下偏移50像素dx, dy = 100, 50M = np.float32([[1, 0, dx], [0, 1, dy]])# 2. 應用平移變換:warpAffine(輸入圖,矩陣,輸出尺寸)# 輸出尺寸需與原圖像一致(寬,高)shifted_frame = cv2.warpAffine(frame, M, (frame.shape[1], frame.shape[0]))# 顯示結果(對比原圖像與平移后圖像)cv2.imshow('Original Frame', frame)cv2.imshow('Shifted Frame (dx=100, dy=50)', shifted_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

2. 旋轉:繞指定點旋轉圖像

旋轉需指定「旋轉中心、旋轉角度、縮放因子」,通過cv2.getRotationMatrix2D自動生成旋轉矩陣,避免手動構造復雜矩陣。

代碼實現:
import cv2
import numpy as np# 讀取圖像
img = cv2.imread('ocv01.jpg')
if img is None:print("無法讀取圖像")exit()# 獲取圖像尺寸(高,寬)
rows, cols = img.shape[:2]# 1. 生成旋轉矩陣
# getRotationMatrix2D(旋轉中心,旋轉角度,縮放因子)
# 示例:繞圖像中心旋轉45°,縮放為原尺寸的0.6倍
center = (cols / 2, rows / 2)  # 旋轉中心(x=寬/2,y=高/2)
angle = 45                     # 旋轉角度(正數=逆時針,負數=順時針)
scale = 0.6                    # 旋轉后圖像的縮放因子
M = cv2.getRotationMatrix2D(center, angle, scale)# 2. 應用旋轉變換:輸出尺寸設為2*cols、2*rows,避免旋轉后圖像被裁剪
rotated_img = cv2.warpAffine(img, M, (2 * cols, 2 * rows))# 顯示結果
cv2.imshow('Original', img)
cv2.imshow('Rotated (45° CCW, scale=0.6)', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 仿射變換:保持平行線不變的變換

仿射變換通過3 對對應點確定變換(需保證 3 點不共線),核心是「保持平行線不變」,適用于圖像傾斜矯正(如傾斜的文檔)。

代碼實現:
import cv2
import numpy as np
from matplotlib import pyplot as plt# 讀取圖像(注意:matplotlib顯示需轉換為RGB格式)
img = cv2.imread('ocv01.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR轉RGB
rows, cols = img.shape[:2]# 1. 定義3對對應點(原圖像點 → 目標圖像點)
# 原圖像中3個不共線的點
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
# 目標圖像中對應的3個點(可根據需求調整,實現傾斜矯正)
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 2. 生成仿射變換矩陣
M = cv2.getAffineTransform(pts1, pts2)# 3. 應用仿射變換
affine_img = cv2.warpAffine(img_rgb, M, (cols, rows))# 用matplotlib顯示對比
plt.subplot(121), plt.imshow(img_rgb), plt.title('Original')
plt.subplot(122), plt.imshow(affine_img), plt.title('Affine Transformed')
plt.show()

4. 透視變換:改變投影視角(如鳥瞰圖)

透視變換通過4 對對應點確定變換(需保證 4 點構成凸四邊形),核心是「打破平行線約束」,可將傾斜視角轉換為正視角(如將斜拍的文檔轉為正拍效果)。

代碼實現:
import cv2
import numpy as np
from matplotlib import pyplot as plt# 讀取圖像并轉換為RGB
img = cv2.imread('ocv01.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
rows, cols = img.shape[:2]# 1. 定義4對對應點(原圖像中的四邊形頂點 → 目標圖像中的矩形頂點)
# 原圖像中4個凸四邊形頂點(如斜拍文檔的四個角)
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
# 目標圖像中對應的矩形頂點(如300x300的正方形)
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])# 2. 生成透視變換矩陣
M = cv2.getPerspectiveTransform(pts1, pts2)# 3. 應用透視變換:輸出尺寸設為300x300(與目標矩形匹配)
perspective_img = cv2.warpPerspective(img_rgb, M, (300, 300))# 顯示對比
plt.subplot(121), plt.imshow(img_rgb), plt.title('Original (Tilted)')
plt.subplot(122), plt.imshow(perspective_img), plt.title('Perspective (Top-Down)')
plt.show()

5. 仿射變換 vs 透視變換

對比維度仿射變換(Affine)透視變換(Perspective)
對應點數3 對(不共線)4 對(凸四邊形)
核心特性保持平行線不變打破平行線約束(如近大遠小)
變換矩陣維度2x3 矩陣3x3 矩陣
適用場景圖像傾斜矯正、平移 + 旋轉組合鳥瞰圖生成、文檔矯正、3D 視角轉換

總結

本文覆蓋的 OpenCV 核心技術,是計算機視覺任務的基石:

  1. HSV 顏色檢測:解決 RGB 顏色分割受光照干擾的問題,適用于目標追蹤、顏色篩選。
  2. 圖像縮放:通過插值算法調整尺寸,滿足統一輸入、優化顯示的需求。
  3. 幾何變換
    • 平移 / 旋轉:簡單位置調整,適用于圖像對齊。
    • 仿射變換:保持平行線,適用于傾斜矯正。
    • 透視變換:改變投影視角,適用于文檔掃描、鳥瞰圖生成。

這些技術的靈活組合,可實現更復雜的任務(如「透視矯正 + 顏色檢測」實現文檔中特定顏色文字的提取)。實際應用中,需注意「圖像讀取失敗處理」「坐標與尺寸的一致性」「插值方法選擇」等細節,避免常見 bug。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94770.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[HFCTF2020]EasyLogin

文章目錄TRYWP總結TRY 注冊admin報錯username wrong。 隨便注冊一個用戶點擊GetFlag,permission deny。 猜測可能是需要admin權限。 看cookie發現有: sses:aok:eyJ1c2VybmFtZSI6ImEiLCJfZXhwaXJlIjoxNzU2NDU1NjczMTAxLCJfbWF4QWdlIjo4NjQwM…

Java接口和抽象類的區別,并舉例說明

Java接口和抽象類是面向對象編程中實現抽象的兩種機制,它們在語法、設計目的和使用場景上有顯著區別:一、核心區別?定義方式?抽象類:使用abstract class聲明,可包含抽象方法和具體方法45。接口:使用interface聲明&am…

docker-相關筆記

1: 導入鏡像 docker load -i myimage.tar# 導出鏡像 docker save myimage:latest > myimage.tar # 導入鏡像 docker load -i myimage.tardocker load -i <文件> 功能&#xff1a;用于導入通過 docker save 命令導出的鏡像歸檔文件&#xff08;通常是 .tar 格式&#…

自然語言提取PDF表格數據

自然語言提取PDF表格數據PDF v8.2的文檔解決方案與OpenAI實現了無縫的AI集成&#xff0c;可將非結構化PDF轉換為可用數據。MESCIUS 推出的 PDF 文檔解決方案 (DsPdf) 是一款軟件開發工具包&#xff0c;它提供了 .NET Core 庫和一個 JavaScript PDF 查看器&#xff0c;用于處理和…

飛牛Nas每天定時加密數據備份到網盤,基于restic的Backrest筆記分享

1. 前言 受前輩“RAID≠備份”的經驗&#xff0c;也考慮到硬盤故障時 RAID 重建步驟繁瑣&#xff0c;我干脆放棄陣列&#xff0c;直接單盤運行。 重要數據則加密后上傳至大廠云盤&#xff1a;一方面文件對外不可讀&#xff0c;規避掃描和諧&#xff1b;另一方面依靠大廠的數據安…

C#連接SQL-Server數據庫超詳細講解以及防SQL注入

C#連接SQL Server數據庫完整指南&#xff0c;整合了ADO.NET原生連接與Entity Framework Core兩種實現方式。這篇文件詳細介紹C#代碼連接數據庫的通用操作數據庫鏈接功能 數據庫的增刪改查操作1 配置全局數據庫鏈接字符串 App.config2 獲取數據庫鏈接字符串先在App.config配置連…

Pico2?ICE FPGA 開發板:從開箱到跑通示例的全歷程

FPGA 和 MCU 結合的開發板不多&#xff0c;而 Pico2?ICE 則把小巧、靈活和易上手完美結合。搭載 RP2350 雙核 RISC-V MCU Lattice iCE40UP5K FPGA&#xff0c;配合官方 SDK&#xff0c;你可以一步步跑通各種示例&#xff0c;從 LED 到 VGA&#xff0c;再到 MCU 與 FPGA 協作應…

Java圖形圖像處理【Swing圖像拖拽】【五】

Java圖形圖像處理【Swing圖像拖拽】 18.3.3 Swing圖像對象拖拽功能 18.3.3 Swing圖像對象拖拽功能 上文討論的是java.awt.dnd包中提供的拖拽API接口&#xff0c;也可稱之為AWT組件的拖拽功能。下面我們要討論的是Swing框架的拖拽功能&#xff1a;Swing組件也提供了對拖拽功能的…

狀態模式與幾個經典的C++例子

1. 狀態模式定義與核心思想 狀態模式解決的是當控制一個對象狀態轉換的條件表達式過于復雜時的情況。通過將狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把復雜的判斷邏輯簡化。 核心思想: 狀態抽象:將對象的每個狀態都封裝到一個獨立的類中。 委托代替條件判斷:…

SyncBackPro 備份及同步軟件中的腳本功能簡介

腳本提供了一種靈活而簡單的方法來自動執行任務和擴展應用程序的功能。腳本是一個小程序&#xff0c;能夠自定義和控制備份作業。例如&#xff0c;用戶可以編寫腳本來復制、重命名或刪除特定文件、自定義用戶界面或更改配置文件設置。SyncBackPro 的腳本功能類似于 Microsoft O…

部署2.516.2版本的jenkins,同時適配jdk8

&#x1f4cc; 前言 在企業級開發中&#xff0c;我們常常面臨 新老項目并存 的復雜局面&#xff1a; 老項目基于 JDK 8 開發&#xff0c;短期內無法升級&#xff1b; 新項目采用 JDK 17&#xff08;LTS&#xff09;甚至更高版本&#xff1b; 而作為 CI/CD 核心的 Jenkins&#…

Autodesk Maya 2026.2 全新功能詳解:MotionMaker AI 動畫、LookdevX 材質增強、USD 工作流優化

軟件介紹 Autodesk Maya 2026.2是一款專業的3D計算機圖形軟件&#xff0c;它為數字內容創作者提供了豐富的工具集&#xff0c;以實現高質量的建模、動畫、模擬和渲染。該版本帶來了多項性能優化和工作流程改進&#xff0c;特別是針對生成式動畫工具MotionMaker進行了重大升級&…

STM32之DMA詳解

一、DMA 1. DMA的引入 在嵌入式系統或計算機系統中&#xff0c;數據的傳輸和處理是非常重要的操作。以下通過一個簡單的示例來展示傳統數據操作方式與 DMA 引入的必要性&#xff1a; int a 10; int b 20;a b;上述代碼包含了變量定義、初始化以及變量數據賦值操作。在傳統…

鏈表有環找入口節點原理

環形鏈表入口檢測算法數學解釋 數學原理假設定義: 鏈表頭到環入口的距離為 a環入口到相遇點的距離為 b相遇點到環入口的距離為 c環的長度為 b c第一次相遇時: 慢指針走了 s a b 步快指針走了 f a b n(b c) 步&#xff0c;其中 n 是快指針在環內轉的圈數由于快指針速度是…

Java 基本類型與包裝類詳解

Java 基本類型與包裝類詳解 在 Java 開發中&#xff0c;理解 基本數據類型與包裝類、字符串處理、以及高精度計算類是非常核心的能力。這不僅關系到程序性能&#xff0c;還影響代碼的正確性和可維護性。本文將詳細講解這些知識點&#xff0c;并給出常見的使用技巧和陷阱。 1?…

CRYPT32!CryptMsgUpdate函數分析之CRYPT32!PkiAsn1Decode函數的作用是得到pci

第一部分&#xff1a; CryptMsgUpdate( #endifIN HCRYPTMSG hCryptMsg,IN const BYTE *pbData,IN DWORD cbData,IN BOOL fFinal) {ContentInfo *pci NULL;if ((PHASE_FIRST_FINAL pcmi->dwPhase) &&(0 pcmi->dwMsgType)) {if (0 …

華為交換機S5700設置acl

1.、配置ACL1.1、定義允許的ACL規則[sw1]acl number 3001[sw1-acl-adv-3001]rule permit ip source 192.168.20.0 0.0.0.255 destination 192.168.40.1 0[sw1-acl-adv-3001]rule permit ip source 192.168.30.0 0.0.0.255 destination 192.168.40.1 01.2、定義禁止的ACL規則[sw…

在使用spring ai進行llm處理的rag的時候,選擇milvus還是neo4j呢?

在使用spring ai進行llm處理的rag的時候&#xff0c;選擇milvus還是neo4j呢&#xff1f; 對于Spring AI中的RAG&#xff08;Retrieval-Augmented Generation&#xff09;應用&#xff0c;選擇Milvus還是Neo4j&#xff0c;主要取決于你的數據類型以及RAG流程中對數據檢索的側重點…

計算機視覺與深度學習 | 視覺里程計技術全景解析:從原理到前沿應用

視覺里程計技術全景解析:從原理到前沿應用 一、定義與核心價值 二、技術原理與分類體系 2.1 基本工作流程 2.2 主流技術路線對比 2.3 算法范式演進 三、典型應用場景 3.1 地面移動機器人 3.2 自動駕駛領域 3.3 深空探測 3.4 增強現實 四、核心技術挑戰與突破路徑 4.1 主要技術…

Wireshark和USRP捕獲同一信號波形差異原因

一、波形差異 在前面的博客中我對比繪制了同一信號的Wireshark和USRP兩種波形&#xff1a; 可以看出波形差別還是挺大的&#xff0c;尤其是在信號分布間隔方面。 我猜想Wireshark的一條數據包在物理上并不是連續的&#xff1a; 而是分組發送&#xff0c;但在Wireshark中合并在…