使用 OpenCV 實現哈哈鏡效果

在計算機視覺和圖像處理領域,OpenCV 提供了非常強大的圖像幾何變換能力,不僅可以用于糾正圖像,還能制造各種“有趣”的視覺效果。今天,我們就來實現一個經典的“哈哈鏡”效果,讓圖像像在游樂園里一樣被拉伸、壓縮、扭曲,創造出令人發笑的面部或形體變形。

🎯 什么是“哈哈鏡”?

“哈哈鏡”是一種非線性扭曲鏡面,會在不同區域產生放大或縮小的視覺錯覺。我們可以用數學變換模擬出類似的效果,比如:

  • 水平凹面/凸面:圖像左右邊緣被拉伸或收縮

  • 垂直凹面/凸面:圖像上下邊緣被拉伸或壓縮

  • 中心凹面/凸面:圖像向內或向外膨脹

  • 水波擾動:從若干中心點向外擴散波紋,模擬水面晃動感


🔧 技術實現原理

我們將使用 OpenCV 的 remap 函數,它允許我們通過兩個映射矩陣 map_xmap_y,定義每個輸出像素應該對應輸入圖像的哪個位置。

關鍵在于如何構造這兩個映射矩陣,讓它們產生扭曲效果。


🧪 示例代碼:中心凸面效果(魚眼)

import cv2
import numpy as npdef funhouse_effect(frame):h, w = frame.shape[:2]map_y, map_x = np.indices((h, w), dtype=np.float32)# 計算圖像中心cx, cy = w // 2, h // 2# 構造相對坐標dx = map_x - cxdy = map_y - cyr = np.sqrt(dx**2 + dy**2)r_max = np.max(r)# 控制扭曲強度k = 0.0008  # 越大越扭曲(中心凸出)scale = 1 + k * (r**2)  # 非線性放大map_x = cx + dx * scalemap_y = cy + dy * scale# 保證映射范圍合法map_x = np.clip(map_x, 0, w - 1)map_y = np.clip(map_y, 0, h - 1)return cv2.remap(frame, map_x, map_y, interpolation=cv2.INTER_LINEAR)frame = cv2.imread("face.jpg")
output = funhouse_effect(frame)
cv2.imwrite("distorted.jpg", output)


📚 多種哈哈鏡效果

你可以基于上面的思路實現更多效果:

效果類型扭曲方式示意說明
水平凹面scale = 1 - k * ((x-cx)/cx)^2中心寬、邊窄
垂直凸面scale = 1 + k * ((y-cy)/cy)^2中心鼓起
中心凹面scale = 1 - k * r^2邊緣大、中心小
隨機水波擾動sin(r * 頻率 + 相位) 疊加擾動水波紋起伏感


🔄 通用框架:FrameObject 封裝

為了在實時視頻或處理多個幀時使用,我們可以封裝為如下類:

class FrameObject:def __init__(self):self.mode = 'random_wave'  # 選擇效果def do(self, frame, device):h, w = frame.shape[:2]map_y, map_x = np.indices((h, w), dtype=np.float32)cx, cy = w // 2, h // 2dx = map_x - cxdy = map_y - cyr = np.sqrt(dx**2 + dy**2)if self.mode == 'center_fisheye':scale = 1 + 0.0006 * (r**2)map_x = cx + dx * scalemap_y = cy + dy * scaleelif self.mode == 'horizontal_cave':scale = 1 - 0.0012 * ((dx / cx) ** 2)map_x = cx + dx * scalemap_y = map_yelif self.mode == 'random_wave':for _ in range(np.random.randint(1, 4)):wave_cx = np.random.randint(w // 4, 3 * w // 4)wave_cy = np.random.randint(h // 4, 3 * h // 4)ddx = map_x - wave_cxddy = map_y - wave_cyrr = np.sqrt(ddx**2 + ddy**2)phase = np.random.uniform(0, 2 * np.pi)displacement = 8 * np.sin(rr * 0.05 + phase)map_x += displacement * (ddx / (rr + 1e-6))map_y += displacement * (ddy / (rr + 1e-6))map_x = np.clip(map_x, 0, w - 1)map_y = np.clip(map_y, 0, h - 1)return cv2.remap(frame, map_x, map_y, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REFLECT)


🎥 應用場景

  • 互動鏡像設備(如景區搞笑自拍)

  • 視頻濾鏡制作(社交媒體)

  • 教學演示圖像幾何變換原理

  • 圖像增強(用作數據增強的一種方式)


🧠 總結

使用 OpenCV,我們可以輕松實現各種非線性圖像變換來模擬“哈哈鏡”效果。本質上是通過構建合適的映射矩陣 map_xmap_y,來控制每個像素的位置變換。配合正弦波、極坐標縮放、指數函數等,你可以無限創造各種扭曲方式。


如果你對某種特定變形方式感興趣,或者想將其用于實時視頻流、交互系統中,歡迎留言交流!🎉

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

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

相關文章

AI|Java開發 IntelliJ IDEA中接入本地部署的deepseek方法

目錄 連接本地部署的deepseek: IntelliJ IDEA中使用deepseek等AI: 用法一:讓AI寫代碼 用法二:選中這段代碼,右鍵,可以讓其解釋這段代碼的含義。這時顯示的解釋是英文的。 連接本地部署的deepseek&#…

如何使用兩塊硬盤作為 Ubuntu24 的系統盤,實現壞掉一塊不影響系統運行。

最近我想使用Ubuntu組一個NAS系統,想實現系統盤冗余,各位大佬可以給點建議嗎。 Deep Seek 為了實現兩塊硬盤作為 Ubuntu 24 系統盤的冗余配置(RAID 1),確保一塊硬盤損壞時系統仍可運行,以下是詳細步驟&am…

【2025最新】虛擬機安裝macos,VMware在Windows11上安裝macOS 15完整圖文教程 - 新手也能輕松上手

引言 想體驗蘋果系統但不想買Mac電腦?別擔心!本教程將手把手教你如何在Windows11環境下,通過VMware虛擬機安裝macOS Sequoia15系統。即使你是零基礎小白,按照這個步驟操作,也能輕松搞定! 準備工作 在開始…

論文閱讀筆記——Emerging Properties in Unified Multimodal Pretraining

BAGEL 論文 商業閉源系統與學術/開源模型的差距很大,BAGEL 旨在通過開源統一架構大規模交錯數據主要解決: 架構割裂:理解/生成分屬兩條網絡,信息被壓縮在少量條件 token 中,長上下文推理受限。數據貧乏:主…

Go 語言基礎1 Slice,map,string

更多個人筆記見: github個人筆記倉庫 gitee 個人筆記倉庫 個人學習,學習過程中還會不斷補充~ (后續會更新在github上) 文章目錄 stirng 字符串區分 rune,byte,string字符串操作strings 庫相關 f…

C# AI(Trae工具+claude3.5-sonnet) 寫前后端

這是一個AI 寫的前后端分離項目,通過AI編程,開發電商管理系統(登陸、注冊) 使用的AI工具為 Trae工具(字節國際版)claude3.5-sonnet(目前代碼最強模型) 前端為 vue3Bootstrap 后端為 C# net5.0(因為我電腦里面已經安裝了這個新版更好) do…

10G/25G PCS only mode for CoaXPress Over Fiber

背景 在CoaXPress Over Fiber的需求中, 需要利用XGMII的PCS 實現25G 數據速率的穩定傳輸,也就是不需要其MAC層,只保留PMA PCS層,借用其物理端口 線纜,實現其它協議的數據傳輸。 25G PCS 25GMII 的 TX/RX 時鐘頻率在 DDR&#xff…

掌握聚合函數:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的區別

對于Java后端開發來說,必須要掌握常用的聚合函數:COUNT,MAX,MIN,SUM,AVG,掌握GROUP BY和HAVING子句的用法,掌握Where和HAVING的區別: ? 一、常用聚合函數(聚…

無人機飛行間隔安全智能評估、安全風險評估

無人機空中安全飛行評估需結合改進碰撞模型、蒙特卡洛仿真、安全間隔反推及動態避障策略,通過多機型分類與實時數據融合,實現從理論建模到實際部署的全流程管控,為城市低空密集飛行提供安全保障。 需求 無人機飛行間隔安全智能評估 無人機…

pdf圖片導出(Visio和Origin)

一、Visio 導入pdf格式圖片 1. 設計->大小,適應繪圖。 2. 文件->導出,導出為pdf格式。 上面兩部即可得到只包含圖的部分的pdf格式。 如果出現的有默認白邊,可以通過以下方式設置: 1. 文件->選項->自定義功能區->…

實現一個帶有授權碼和使用時間限制的Spring Boot項目

生成和驗證授權碼記錄授權時間和過期時間實現授權邏輯 以下是具體的實現方法: 1. 生成和驗證授權碼 可以使用加密技術生成和驗證授權碼。授權碼中可以包含有效期等信息,并使用密鑰進行簽名。 示例代碼: java復制代碼 import javax.crypt…

官方SDK停更后的選擇:開源維護的Bugly Unity SDK

騰訊Bugly,為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現并解決異常,同時掌握產品運營動態,及時跟進用戶反饋。 但是,免費版的Unity SDK已經很久不更新了,會有一些問題和特性缺失&#xff…

Spring Boot分頁查詢進階:整合Spring Data REST實現高效數據導航

目錄: 引言分頁查詢基礎回顧 2.1 Spring Data JPA分頁接口 2.2 Pageable與Page的使用 2.3 常見分頁參數設計Spring Data REST簡介 3.1 HATEOAS與超媒體驅動API 3.2 Spring Data REST核心功能 3.3 自動暴露Repository接口整合Spring Boot與Spring Data REST 4.1 項目…

[Datagear] [SQL]實現分組統計同時帶匯總行的兩種方式對比分析

在進行數據可視化開發時,我們經常會遇到用戶提出的需求:除了展示按某字段分組統計的數據外,還希望看到一個“整體總計”的數據行。這種匯總行在報表、圖表展示中極為常見,可以幫助用戶快速理解全局數據水平。 實現這一功能的方法主要有兩種:一種是使用 SQL 的 GROUP BY ..…

Docker常用命令介紹

Docker常用命令 1、本地鏡像管理 save 命令 將一個或多個 Docker 鏡像保存到一個 tar 歸檔文件中,以便在其他環境中分發或備份。 # 語法:docker save [OPTIONS] IMAGE [IMAGE...]# 保存單個鏡像到文件 docker save -o myimage.tar myimage:latest# 保…

09 接口自動化-用例管理框架pytest之allure報告定制以及數據驅動

文章目錄 一、企業級的Allure報告的定制左邊的定制:右邊的定制:1.用例的嚴重程度/優先級2.用例描述3.測試用例連接的定制4.測試用例步驟的定制5.附件的定制 二、企業中真實的定制有哪些?三、allure報告如何在本地訪問四、allure中的數據驅動裝…

DDoS防護實戰——從基礎配置到高防IP部署

一、基礎防護:服務器與網絡層加固 Linux內核優化: 調整TCP協議棧參數,緩解SYN Flood攻擊: # 啟用SYN Cookie并減少超時時間 echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout…

華為云Flexus+DeepSeek征文|Flexus云服務器Dify-LLM資源部署極致體驗Agent

前引:重磅來襲!本次以DeepSeek-V3/R1商用大模型和Dify-LLM應用平臺一鍵部署為核心,專為新手打造“開箱即用”的AI開發體驗。無論你是想快速搭建企業級AI應用,還是探索大模型落地的無限可能,只需跟隨小編實現三步走&…

SQLAlchemy 2.0 查詢使用指南

SQLAlchemy 2.0 查詢使用指南 1. 環境設置 首先,需要安裝 SQLAlchemy 2.0 版本。假設你使用的是 SQLite 數據庫,可以通過以下命令安裝 SQLAlchemy: pip install sqlalchemy接著,我們創建數據庫連接并初始化會話: f…

Windows 使用 WSL 安裝 Ubuntu

一,前言 Windows 上輕松跑 Linux 又不想用笨重的VMware 和VirtualBox ,怎么辦? 開源項目 Windows Subsystem for Linux (WSL)。它解決了許多開發者在 Windows 和 Linux 間切換的痛點,實現在 Windows 上無縫跑 Linux 工具和命令。…