使用 OpenCV 實現“隨機鏡面墻”——多鏡片密鋪的哈哈鏡效果

1. 引言

“哈哈鏡”是一種典型的圖像變形效果,通過局部鏡面反射產生扭曲的視覺趣味。在計算機視覺和圖像處理領域,這類效果不僅有趣,還能用于藝術創作、交互裝置、視覺特效等場景。

傳統的“哈哈鏡”往往是針對整張圖像做某種鏡像或扭曲變換,而如果我們將圖像劃分為多個小鏡片,每個鏡片獨立做鏡面反射,拼成一面“鏡子墻”,效果更豐富,也更具創意。

本文將介紹如何使用 Python 和 OpenCV 實現這樣一種“隨機鏡面墻”效果:

  • 在圖像上隨機生成多個點,利用三角剖分將圖像切成多個小三角形面片(鏡片)。

  • 對每個鏡片分別以其重心為中心做局部鏡面反射變換。

  • 最后將所有變換后的鏡片無縫拼接,形成一幅由多個鏡面組成的“哈哈鏡”墻。


2. 基礎準備:OpenCV 簡介

OpenCV 是一個開源的計算機視覺庫,提供了豐富的圖像處理功能,如圖像讀取、變換、繪制等。

本案例中,主要用到的功能包括:

  • cv2.fillConvexPoly:繪制多邊形掩碼

  • cv2.boundingRect:獲取多邊形的最小外接矩形

  • cv2.warpAffine:仿射變換實現局部鏡像

  • NumPy 進行數組和坐標操作


3. 設計思路

3.1 隨機采樣點 + 邊界點

在圖像區域內隨機采樣若干點(50~100個),并額外加入圖像四個角點,確保后續切割覆蓋整幅圖。

3.2 Delaunay 三角剖分密鋪

使用 SciPy 的 Delaunay 對采樣點做三角剖分,得到一組不重疊的三角形面片,組成密鋪。

3.3 計算三角形重心

對每個三角形頂點坐標求均值,得到重心作為局部鏡面的“反射中心”。

3.4 局部鏡面反射變換

以三角形重心為中心,利用仿射變換矩陣實現水平或垂直鏡像(或旋轉+鏡像)。

  • 例如水平鏡像矩陣為:

M=[?102cx010]M = \begin{bmatrix} -1 & 0 & 2c_x \\ 0 & 1 & 0 \end{bmatrix}M=[?10?01?2cx?0?]

其中 cxc_xcx? 是重心的水平坐標(相對于當前ROI局部坐標)。

3.5 裁剪與拼接

  • 對每個三角形計算外接矩形,裁剪圖像和掩碼。

  • 將鏡像變換后的結果放回對應位置,只覆蓋三角形區域。


4. 關鍵代碼示例

import cv2
import numpy as np
from scipy.spatial import Delaunayclass FrameObject:def __init__(self):passdef do(self, frame, device):h, w = frame.shape[:2]# 生成隨機點 + 添加四角num_points = np.random.randint(50, 101)points = np.random.randint(0, [w, h], size=(num_points, 2))corners = np.array([[0,0], [w-1,0], [w-1,h-1], [0,h-1]])points = np.vstack((points, corners))# Delaunay 三角剖分tri = Delaunay(points)triangles = points[tri.simplices]result = np.zeros_like(frame)for tri_pts in triangles:# 創建掩碼,繪制三角形mask = np.zeros((h, w), dtype=np.uint8)cv2.fillConvexPoly(mask, tri_pts, 255)# 計算重心centroid = np.mean(tri_pts, axis=0)# 裁剪ROI區域x, y, bw, bh = cv2.boundingRect(tri_pts)roi = frame[y:y+bh, x:x+bw]mask_roi = mask[y:y+bh, x:x+bw]# 轉換重心到ROI局部坐標系cx, cy = centroid - np.array([x, y])# 構造水平鏡像仿射矩陣M = np.array([[-1, 0, 2*cx],[0, 1, 0]], dtype=np.float32)# 對ROI做鏡像變換warped = cv2.warpAffine(roi, M, (bw, bh), flags=cv2.INTER_LINEAR)# 利用掩碼覆蓋變換結果mask_bin = (mask_roi > 0)for c in range(frame.shape[2]):result[y:y+bh, x:x+bw, c][mask_bin] = warped[:, :, c][mask_bin]return result

5. 運行效果與拓展

  • 運行后你會看到畫面被切割成許多小三角形鏡片,每個鏡片都經過水平鏡像,組成豐富的鏡面墻效果。

  • 可以將 M 變換矩陣換成垂直鏡像、旋轉鏡像,甚至結合水波扭曲,做出更多變化。

  • 采樣點數越多,鏡片越細密,視覺越復雜。


6. 總結

本文介紹了如何結合 OpenCV 和 SciPy,基于隨機采樣點和 Delaunay 三角剖分,將圖像劃分為多個小鏡片,并對每個鏡片獨立應用鏡像變換,模擬“鏡子墻”哈哈鏡效果。

此方法不僅簡單高效,還極具擴展性。你可以基于此框架增加更多變換模式、動態動畫或實時視頻處理,創造更多炫酷的視覺效果。


如果你喜歡這篇教程,歡迎點贊、收藏和留言交流!
更多圖像處理技術,歡迎關注我的博客。

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

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

相關文章

Python訓練營打卡——DAY33(2025.5.22)

目錄 簡單的神經網絡 一、PyTorch的安裝 二、準備工作 三、數據的準備 四、模型架構定義 五、模型訓練(CPU版本) 1. 定義損失函數和優化器 2. 開始循環訓練 3. 可視化結果 六、通俗解釋 1. 環境安裝(相當于買鍋碗瓢盆)…

目標檢測 Lite-DETR(2023)詳細解讀

文章目錄 迭代高級特征跨尺度融合高效的低層次特征跨尺度融合KDA:Key-aware Deformable Attention 論文翻譯: CVPR 2023 | Lite DETR:計算量減少60%!高效交錯多尺度編碼器-CSDN博客 DINO團隊的 (Lightweight Transfo…

ES(Elasticsearch) 基本概念(一)

Elasticsearch作為當前最流行的開源搜索和分析引擎,廣泛應用于日志分析、全文搜索、業務智能等領域。Elasticsearch是一個基于 Apache Lucene 構建的分布式搜索和分析引擎、可擴展數據存儲和矢量數據庫。它針對生產級工作負載的速度和相關性進行了優化。使用 Elasti…

當物聯網“芯”闖入納米世界:ESP32-S3驅動的原子力顯微鏡能走多遠?

上次咱們把OV2640攝像頭“盤”得明明白白,是不是感覺ESP32-S3這小東西潛力無限?今天,咱們玩個更刺激的,一個聽起來就讓人腎上腺素飆升的挑戰——嘗試用ESP32-S3這顆“智慧芯”,去捅一捅科學界的“馬蜂窩”,…

Excel合并單元格后,如何自動批量生成序號列

1.選擇整列 2.組合鍵:CtrlG 3.定位條件,選擇“空值” 4.在第一個框中輸入“MAX(”,鼠標選中A1框,后加“:”,鼠標選中前方“A1”,按“F4”絕對引用,補全右括號,后輸入“1…

TDengine 運維—容量規劃

概述 若計劃使用 TDengine 搭建一個時序數據平臺,須提前對計算資源、存儲資源和網絡資源進行詳細規劃,以確保滿足業務場景的需求。通常 TDengine 會運行多個進程,包括 taosd、taosadapter、taoskeeper、taos-explorer 和 taosx。 在這些進程…

Axure設計數字鄉村可視化大屏:從布局到交互的實戰經驗分享

鄉村治理正從傳統模式向“數據驅動”轉型。數字鄉村可視化大屏作為數據展示的核心載體,不僅能直觀呈現鄉村發展全貌,還能為決策提供科學依據。本文以Axure為工具,結合實際案例,分享如何從零設計一個功能完備、交互流暢的數字鄉村大…

從零基礎到最佳實踐:Vue.js 系列(1/10):《環境搭建與基礎概念》

Vue.js 環境搭建與基礎概念 關鍵點 Vue.js 是一個簡單易用的前端框架,適合初學者快速上手。搭建開發環境需要安裝 Node.js 和 npm/Yarn,推薦使用最新 LTS 版本。Vue CLI 是官方工具,可快速創建項目并提供開發服務器。Vue.js 基于 MVVM 模式&…

使用docker compose部署dify(大模型開發使用平臺)

Dify是一款生成式 AI 應用中間件,面向有私有部署與數據合規需求的企業用戶,推動企業向 AI 時代轉型。平臺支持無代碼構建,業務人員即可快速搭建與調試 AI 應用,顯著降低開發門檻。 參考 https://docs.dify.ai/zh-hans/getting-s…

npm 安裝時 SSL 證書過期問題筆記

問題描述: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired 這表明當前配置的 npm 鏡像源(淘寶鏡像 https://registry.npm.taobao.org&…

力扣HOT100之二叉樹: 236. 二叉樹的最近公共祖先

果然,這道題二刷還是不會做,回去看卡爾視頻了。結合靈神的題解,我對這道題有了一些新的理解。 首先這道題還是用遞歸來做,由于我們需要計算兩個節點的最近公共祖先,一定是從下往上來遍歷,只有先判斷左右子樹…

Word 轉 HTML API 接口

Word 轉 HTML API 接口 圖像/轉換 Word 文檔轉換為 HTML 文件轉換 / 超高精度與還原度 文件轉換 / Word。 1. 產品功能 超高精度與還原度的 HTML 文件轉換;支持將 Word 文檔轉換為 HTML 格式;支持 .doc 和 .docx 格式;保持原始 Word 文檔的…

idea 安裝飛算-javaAI 插件使用

文章目錄 前言idea 安裝飛算-javaAI 插件使用1. 介紹一下飛算-AI2. 安裝使用 前言 如果您覺得有用的話,記得給博主點個贊,評論,收藏一鍵三連啊,寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差,實在白嫖的…

Bert預訓練任務-MLM/NSP

MLM MLM:Masked Language Mode:在每一個訓練序列中以15%的概率隨機地選中某個token進行MASK,當一個token被選中后,有以下三種處理方式: 80%的概率被[MASK],如my dog is hairy->my dog is [MASK]10%的概率修改為隨機的其他token,如my dog …

瀏覽器原生 Web Crypto API 實現 SHA256 Hash 加密

寫在前面 在我上一篇文章 《node 后端和瀏覽器前端,有關 RSA 非對稱加密的完整實踐, 前后端匹配的代碼演示》 中,我們使用 瀏覽器原生 Web Crypto API 實現了 RSA 的加密算法。 但是,在我之前的 《我設計的一個安全的 web 系統用…

5G 網絡尋呼的信令及 IE 信息分析

一、尋呼信令的觸發背景 在 5G 網絡中,當網絡側有下行數據要發送給處于空閑態(RRC_IDLE)或非激活態(RRC_INACTIVE)的用戶設備(UE)時,就會觸發尋呼流程。這是因為在這些狀態下,UE 與網絡之間沒有建立持續的無線資源控制(RRC)連接,網絡需要通過尋呼機制來通知 UE 有…

印度語言指令驅動的無人機導航!UAV-VLN:端到端視覺語言導航助力無人機自主飛行

作者:Pranav Saxena, Nishant Raghuvanshi and Neena Goveas單位:比爾拉理工學院(戈瓦校區)論文標題:UAV-VLN: End-to-End Vision Language guided Navigation for UAVs論文鏈接:https://arxiv.org/pdf/250…

基于Zynq SDK的LWIP UDP組播開發實戰指南

一、為什么選擇LWIP組播? 在工業控制、智能安防、物聯網等領域,一對多的高效數據傳輸需求日益增長。Zynq-7000系列SoC憑借其ARM+FPGA的獨特架構,結合LWIP輕量級網絡協議棧,成為嵌入式網絡開發的理想選擇。本文將帶您實現: LWIP組播配置全流程動態組播組切換技術零拷貝數據…

(三)MMA(KeyCloak身份服務器/OutBox Pattern)

文章目錄 項目地址一、KeyCloak二、OutBox Pattern2.1 配置Common模塊的OutBox1. OutboxMessage2. 數據庫配置OutboxMessageConfiguration3. 創建Save前的EF攔截器4. 創建Quartz后臺任務5. 配置后臺任務6. 注冊服務2.2 創建OutBox的消費者1. 自定義IDomainEventHandler2. 定義抽…

初步認識HarmonyOS NEXT端云一體化開發

視頻課程學習報名入口:HarmonyOS NEXT端云一體化開發 1、課程設計理念 本課程采用"四維能力成長模型"設計理念,通過“能看懂→能聽懂→能上手→能實戰”的漸進式學習路徑,幫助零基礎開發者實現從理論認知到商業級應用開發的跨越。該模型將學習過程劃分為四個維度…