<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4611字,需瀏覽 10分鐘

           ·

          2022-02-13 03:09

          點擊上方小白學視覺”,選擇加"星標"或“置頂

          重磅干貨,第一時間送達

          01.計算機視覺概論


          我計劃分享一些有趣的實戰(zhàn)項目,或許達不到商用的級別,但是希望能在大家做項目的時候能夠提供一些思路!如果對你有所幫助,給我點贊 & 在看,讓我知道對你有幫助哈!


          基于OpenCV的顏色檢測和分割的隱形斗篷


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


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


          哈利波特的隱身衣效果


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


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


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


          顏色堅持+分割的demo效果


          它的原理是什么?


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


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


          其基本思想如下:


          1. 捕獲并存儲背景幀。

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

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

          4. 生成最后的增廣輸出,創(chuàng)造神奇的效果。



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




          步驟1:捕捉并存儲背景幀


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


          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’中)。如果一個幀被正確讀取,它將為真。所以你可以通過檢查這個返回值來檢查視頻的結束。


          為什么捕獲背景圖像使用'循環(huán)' ?


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


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



          第二步:檢測紅色


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


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


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


          HSV顏色空間是什么?


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


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

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

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


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


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


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

          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來確定幀中與檢測到的顏色相對應的區(qū)域。我們精煉這個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))
          #creating an inverted mask to segment out the cloth from the framemask2 = cv2.bitwise_not(mask1)
          #Segmenting the cloth out of the frame using bitwise and with the inverted maskres1 = cv2.bitwise_and(img,img,mask=mask2)





          步驟4:生成最終的增強輸出,以創(chuàng)建一個神奇的效果。


          最后,我們將檢測到的紅色區(qū)域的像素值替換為靜態(tài)背景對應的像素值,最后生成一個增強輸出,產生神奇的效果,將我們的布料變成了一件隱身斗篷。為此,我們首先使用bitwise_and操作創(chuàng)建一個像素值對應于檢測區(qū)域的圖像,像素值等于靜態(tài)背景的像素值,然后將輸出添加到我們從中分割出紅布的圖像(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

          # creating image showing static background frame pixels only for the masked regionres2 = cv2.bitwise_and(background, background, mask = mask1)

          #Generating the final outputfinal_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/


          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學視覺公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數、添加眼線、車牌識別、字符識別、情緒檢測、文本內容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現20個實戰(zhàn)項目,實現OpenCV學習進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據研究方向邀請進入相關微信群。請勿在群內發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 23
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  AV色情色 | 在线高清无码 | 青青搞搞| 欧美三级毛片 | 操屄自拍 |