OpenCV黑魔法之隱身衣 | 附源碼

2021-03-02 CVPy

基於OpenCV的顏色檢測和分割的隱形鬥篷

如果你是個哈利波特迷,你就會知道什麼是隱形衣。是的!這是哈利波特用來隱身的隱形衣。當然,我們都知道隱形衣不是真的——它都是圖形上的詭計。

在這篇文章中,我們將學習如何使用OpenCV中的簡單計算機視覺技術創建我們自己的「隱形衣」。文末會分享 C++和python的代碼。

哈利波特的隱身衣效果

那是哈利·波特在試他的隱形衣!

事實上,你可以用一種叫做顏色檢測和分割的圖像處理技術來創造這種神奇的體驗。好消息是,你不需要成為霍格沃茨的一員!你所需要的是一塊紅色的布,並遵循這篇文章。

看看下面的視頻,我在那裡嘗試我自己的隱形衣!

顏色堅持+分割的demo效果

該算法在原理上與綠幕非常相似。但與我們刪除背景的綠幕不同,在這個應用中,我們刪除了前景!

我們用一塊紅色的布做我們的鬥篷。為什麼是紅色呢?為什麼不綠色的嗎?當然,我們可以用綠色,紅色不是魔術師的顏色嗎?除了此之外,像綠色或藍色這樣的顏色也可以稍微調整一下。

其基本思想如下:

1. 捕獲並存儲背景幀。

2. 使用顏色檢測算法檢測紅色布料。

3. 將紅色的布料分割成一個mask。

4. 生成最後的增廣輸出,創造神奇的效果。

上面的GIF簡單地解釋了算法的所有階段。現在我們將詳細討論每一步。

如上所述,關鍵思想是將當前與布料相對應的幀像素替換為背景像素,從而產生一件隱身衣的效果。為此,我們需要存儲一個背景幀。

C++

// Create a VideoCapture object and open the input file// If the input is the web camera, pass 0 instead of the video file nameVideoCapture cap("video4.mp4");// Check if camera opened successfullyif(!cap.isOpened()){  cout << "Error opening video stream or file" << endl;  return -1;}

Mat background;for(int i=0;i<30;i++){ cap >> background;}//Laterally invert the image / flip the image.flip(background,background,1);

Python

# Creating a VideoCapture object# This will be used for image acquisition later in the code.cap = cv2.VideoCapture("video.mp4")
# We give some time for the camera to warm-up!time.sleep(3)
background=0
for i in range(30): ret,background = cap.read()
# Laterally invert the image / flip the image.background = np.flip(background,axis=1)

在上面的代碼中,cap.read()方法使我們能夠通過相機捕獲最新的幀(存儲在變量『background』中),它還返回一個布爾值(True/False存儲在『ret』中)。如果一個幀被正確讀取,它將為真。所以你可以通過檢查這個返回值來檢查視頻的結束。

為什麼捕獲背景圖像使用'循環' ?

因為背景是靜態的,我們不能簡單地使用一個幀嗎?當然,但是與多幀圖像相比,捕獲的圖像有點暗。這是因為相機剛剛開始捕捉幀,因此它的參數還不穩定。因此,使用for循環捕獲靜態背景的多個圖像就可以完成這個任務。

多幀平均也可以降低噪聲。

因為我們使用了一塊紅色的布來將它轉換成一件隱形鬥篷,所以我們將著重於在框架中檢測紅色。

聽起來簡單嗎?我們有一個RGB(紅-綠-藍)圖像,使用簡單閾值的R通道來得到我們的mask。結果證明,這將並不會特別有效,因為RGB值是高度敏感的照明。因此,即使鬥篷是紅色的,也可能有一些區域,由於陰影,相應像素的紅色通道值相當低。

正確的方法是將圖像的顏色空間從 RGB轉換為HSV(色相-飽和度-亮度)。

HSV顏色空間是什麼?

HSV顏色空間表示使用三個值的顏色

1.色相(Hue):這個通道對顏色信息進行編碼。色相可以被認為是一個角度,0度對應紅色,120度對應綠色,240度對應藍色。

2.飽和度(Saturation):這個通道編碼顏色的強度/純度。例如,粉色比紅色的飽和度低。

3.值(Value):該通道對顏色的亮度進行編碼。圖像的陰影和光澤成分出現在這個通道中。

不像RGB是根據三原色來定義的,HSV的定義方式類似於人類感知顏色的方式。

對於我們的應用而言,使用 HSV 顏色空間的主要優點是顏色/色調/波長僅由色相組件表示。

要了解不同的色彩空間,請參考我們關於色彩空間的詳細博客

https://www.learnopencv.com/color-spaces-in-opencv-cpp-python/

所以當我說,我需要一個特定的顏色,選擇色相組件,然後根據飽和度組件,我得到了那個顏色的不同的陰影,進一步根據值組件,我得到了一個顏色的特定陰影的不同的強度。

在下面的代碼中,我們首先捕獲一個活動幀,將圖像從RGB轉換為HSV顏色空間,然後定義一個特定範圍的H-S-V值來檢測紅色。

C++

Mat frame;// Capture frame-by-framecap >> frame;
// Laterally invert the image / flip the imageflip(frame,frame,1);
//Converting image from BGR to HSV color space.Mat hsv;cvtColor(frame, hsv, COLOR_BGR2HSV);
Mat mask1,mask2;// Creating masks to detect the upper and lower red color.inRange(hsv, Scalar(0, 120, 70), Scalar(10, 255, 255), mask1);inRange(hsv, Scalar(170, 120, 70), Scalar(180, 255, 255), mask2);
// Generating the final maskmask1 = mask1 + mask2;

Python

# Capturing the live frameret, img = cap.read()
# Laterally invert the image / flip the imageimg = np.flip(imgaxis=1)
# converting from BGR to HSV color spacehsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# Range for lower redlower_red = np.array([0,120,70])upper_red = np.array([10,255,255])mask1 = cv2.inRange(hsv, lower_red, upper_red)
# Range for upper rangelower_red = np.array([170,120,70])upper_red = np.array([180,255,255])mask2 = cv2.inRange(hsv,lower_red,upper_red)
# Generating the final mask to detect red colormask1 = mask1+mask2

inRange 函數簡單地返回一個二值化掩碼,其中白色像素(255)表示屬於上限和下限範圍的像素,黑色像素(0)不屬於上限和下限範圍的像素。

色相值 實際上分布在一個圓上(範圍在0-360度之間),但在OpenCV中為了適應8bit 值,其範圍是0-180度。紅色由0-30和150-180值表示。

我們使用範圍0-10和170-180,以避免檢測皮膚為紅色。飽和度使用較高範圍120-255的值,因為我們的布料應該是高度飽和的紅色。亮度值在的較低範圍是70,這樣我們也可以在布料的褶皺中檢測到紅色。

mask1 = mask1 + mask2

使用上面的線,我們合併兩個紅色範圍生成的mask。它基本上是在像素上進行OR操作。這是一個操作符重載+的簡單例子。

現在,您已經了解了如何進行顏色檢測,您可以更改H-S-V範圍,並使用一些其他的單色布來代替紅色。事實上,綠色的布比紅色的效果更好,因為綠色離人的膚色差異最大。

在上一步中,我們生成了一個mask來確定幀中與檢測到的顏色相對應的區域。我們精煉這個mask,然後用它從frame上分割布料。下面的代碼說明了它是如何實現的。

C++

Mat kernel = Mat::ones(3,3, CV_32F);morphologyEx(mask1,mask1,cv::MORPH_OPEN,kernel);morphologyEx(mask1,mask1,cv::MORPH_DILATE,kernel);
// creating an inverted mask to segment out the cloth from the framebitwise_not(mask1,mask2);Mat res1, res2, final_output;
// Segmenting the cloth out of the frame using bitwise and with the inverted maskbitwise_and(frame,frame,res1,mask2);

Python

mask1 = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((3,3),np.uint8))mask1 = cv2.morphologyEx(mask, cv2.MORPH_DILATE, np.ones((3,3),np.uint8))
mask2 = cv2.bitwise_not(mask1)
res1 = cv2.bitwise_and(img,img,mask=mask2)

最後,我們將檢測到的紅色區域的像素值替換為靜態背景對應的像素值,最後生成一個增強輸出,產生神奇的效果,將我們的布料變成了一件隱身鬥篷。為此,我們首先使用bitwise_and操作創建一個像素值對應於檢測區域的圖像,像素值等於靜態背景的像素值,然後將輸出添加到我們從中分割出紅布的圖像(res1)中。

C++

// creating image showing static background frame pixels only for the masked regionbitwise_and(background,background,res2,mask1);
// Generating the final augmented output.addWeighted(res1,1,res2,1,0,final_output);imshow("magic", final_output);waitKey(1);

Python

res2 = cv2.bitwise_and(background, background, mask = mask1)

final_output = cv2.addWeighted(res1,1,res2,1,0)imshow("magic",final_output)cv2.waitKey(1)

https://www.learnopencv.com/invisibility-cloak-using-color-detection-and-segmentation-with-opencv/

歡迎加入微信交流群

通過公眾號下方菜單【微信群】加入,暗號:CVPy 或者 OpenCV。

相關焦點

  • OpenCV黑魔法之隱身衣
    歡迎關注 「小白玩轉Python」,發現更多 「有趣」我計劃分享一些有趣的實戰項目
  • 騙過監控的隱身衣!讓物體消失的「魔法」,是AI的無痕隱身
    身穿一件隱身衣,穿梭於監控密布的城市之中,不留痕跡。這應該不只是身為機器人的索菲亞才具有的想法吧? 「任何非常先進的技術,初看都與魔法無異。」而隱身就是一項看起來如此魔法的技術。
  • 楊絳:隱身衣
    我們都要隱身衣;各披一件,同出遨遊。我們只求擺脫羈束,到處閱歷,並不想為非作歹。可是玩得高興,不免放肆淘氣,於是驚動了人,隱身不住,得趕緊逃跑。「阿呀!還得有縮地法!」「還要護身法!」想的越周到,要求也越多,乾脆隱身衣也不要了。
  • 《哈利波特:魔法覺醒》魔法覺醒藏品賞析
    本期魔法覺醒藏品賞析將為大家介紹「大難不死的男孩」哈利·波特的角色藏品,一起回顧這些魔法物品背後的故事。鋒利無比的格蘭芬多之劍在玻璃展櫃中閃著淡淡寒光深浸蛇怪的毒液後這把寶劍成為了擊敗黑魔頭的突破口不同於一般的隱身衣這襲巫師家族代代相傳的神秘鬥篷能讓使用者持續隱身,永久有效任何咒語都無法破解
  • OpenCV之光流
    官方例子#include <iostream>#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <opencv2
  • 迪麗熱巴化身魔法公主閃現一千零一夜,快手黑科技打造炫酷隱身術
    通過短視頻便能實現好萊塢大片般的隱身特效,藉助於快手近期上線的"隱身魔法"系列特效,眾多快手用戶瞬間擁有了魔幻超能力。除了"隱身魔法"外,快手還結合萬聖節南瓜燈、裝扮鬼怪等必備元素,推出幻化蝙蝠、隱身魔法、最美新娘、墨鏡隱身、搗蛋鬼、萬聖南瓜以及雙格隱身等萬聖節系列魔法表情,應用AI技術,為年輕人增添萬聖節新玩法。"一直想擁有哈利波特的隱身衣,今年萬聖節圓滿了,在快手實現了這個願望。"一位用戶在體驗快手新款魔錶特效後曬出自己的視頻。
  • 分分鐘擁有哈利波特的隱身衣,還是在手機端的那種
    沒錯,這個能實時實現電影大片裡隱身特效的黑科技,就是快手最近上線的AI新玩法——「隱身魔法」。這是結合單圖圖像修復和幀間圖像對齊技術的視頻修復算法,在短視頻行業中的首次應用。不僅能「憑空出現」,對著鏡頭比個「6」,你還能當場變身透明人,跟空氣融為一體。
  • 哈利·波特隱形鬥篷現實版:美軍戰機或將披上超薄「隱身衣」
    然而在現實世界中,美國軍方很快也將擁有屬於他們的「光學隱身衣」了。根據《陸軍時報》的報導,加州大學聖地牙哥分校的教授布巴卡爾·坎特(Boubacar Kante)和他的同事們近期研製出一種最新的隱身超材料。坎特團隊正在對材料的「隱身」功效進行最後的評測,並儘快向五角大樓提交評估報告。
  • 87歲老漢痴迷哈利波特,模仿發明了「隱身衣」,鄰居看了無法淡定
    世界之大無奇不有,歡迎大家點擊《老徐說軼事》。每天為大家分享更多的天下奇聞趣聞:《87歲老漢痴迷哈利波特,模仿發明了「隱身衣」,鄰居看了無法淡定》天下之大無奇不有,今日一位80多歲的老漢突然痴迷上了《哈利波特》,哈迷們都知道,故事中有一件可以隱身的隱身衣,沒想到經過幾個月的努力,這名老漢也成功發明了一件,到底是怎麼回事呢,我們一起來看看吧。
  • 「python opencv 計算機視覺零基礎實戰」第一節
    一、學習目標安裝opencv了解什麼是計算機視覺了解讀取圖片的方法了解顯示圖片的方法二、完成opencv的helloworld程序編寫2.1 opencv是什麼要了解opencv是什麼,首先可以看在opencv中,集成了很多方法,可以讓我們開發者很容易的完成某些視覺上的操作,完成某些目標;通過opencv,可以讓我們無需了解太多的算法知識,簡便的進行開發。
  • opencv教程-霍夫變換、圖像分割
    opencv示例的圖片和視頻:https://github.com/opencv/opencv/tree/master/samples/data1:模板匹配opencv裡的模板匹配就不說了,也就是從當前圖像提取模板圖像匹配還好,換一個不同圖片的模板就不行了,而且對縮放的模板匹配效果也很差,就說下基本流程如下:圖像灰度化→cv2.matchTemplate→cv2
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 一個照片「隱身衣」,讓微軟曠視人臉識別系統100%失靈|開源
    給照片穿上「隱身衣」這項研究的目的,是幫助網友們在分享自己的照片的同時,還能有效保護自己的隱私。因此,「隱身衣」本身也得「隱形」,避免對照片的視覺效果產生影響。也就是說,這件「隱身衣」,其實是對照片進行像素級別的微小修改,以蒙蔽AI的審視。
  • 電影走進現實:鋼鐵戰衣不是夢想隱身鬥篷成真
    電影走進現實:鋼鐵戰衣不是夢想隱身鬥篷成真 時間:2013.06.06 來源:人民政協網 分享到:
  • python 基於opencv 繪製圖像輪廓
    這篇文章主要介紹了python 基於opencv 繪製圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
  • 測試~python庫介紹(一) opencv
    過程和結果一般會是這樣的o(╥﹏╥)o是的,數著數著就瞌睡了,然後從頭再來\(^o^)/~如今,python可以完美的解決這種問題,今天給大家介紹可以實現拆幀的一個python庫:opencv-python,通過視頻拆幀的形式解決所有突發的不復用的評測需求。
  • 讓殲20隱身「戰衣」超F22,出口把控很關鍵
    舉報   提到石墨烯這種元素,相信大部分都不怎麼陌生,因為石墨烯曾一度號稱21世紀的材料之王
  • 魔法迷來討論 「伏地魔」與「格林德沃」誰是最強「黑魔法之王」
    小編也算是大半個魔法迷吧!由電影《哈利波特》系列開始,接觸魔法世界。也因該系列電影,喜歡上JK羅琳的魔法世界。不得不說羅琳創造的魔法世界,前前後後風靡了世界十多年。有多少粉絲像小編一樣曾經沉浸在魔法世界無法自拔吧。
  • 小豆子在淘寶上買了件隱身衣,拿到課堂上實驗,果然是真的!
    小豆子在淘寶上買了件隱身衣,拿到課堂上實驗,果然是真的!