# Python學習筆記 0007 ## WEBCAM video capture ```javascript= import cv2 import numpy as np frameWidth = 640 frameHeight = 480 cap = 1.mp4 cap.set(3, frameweight) cap.set(4,frameHeight) while True: _ , img = cap.read() cv2.imshow('Original', img) if cv2.waitkay(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()import cv2 import numpy as np frameWidth = 640 frameHeight = 480 cap = 1.mp4 cap.set(3, frameweight) cap.set(4,frameHeight) while True: _ , img = cap.read() cv2.imshow('Original', img) if cv2.waitkay(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` ## BGR to HSV ```javascript= import cv2 import numpy as np frameWidth = 640 frameHeight = 480 cap = cv2.VideoCapture("2.mp4") cap.set(3, frameweight) cap.set(4,frameHeight) while True: _ , img = cap.read() imgHsv = cv2.cvtColor(cap , cv2.COLOR_BGR2HSV) cv2.imshow('Original', cap) cv2.imshow('imgHsv', imgHsv) if cv2.waitkay(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` ![](https://i.imgur.com/u3xORNY.png) :::spoiler HSV(顏色模型) HSV(Hue, Saturation, Value)是根據顏色的直觀特性 由 A. R. Smith 在 1978 年創建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。 這個模型中顏色的參數分別是色調(H)、飽和度(S)和明度(V)。 ## 顏色模型 ### 色調H 用角度度量,取值範圍為0°~360°,從紅色開始按逆時針方向計算, 紅色為0°,綠色為120°,藍色為240° 黃色為60°,青色為180°,紫色為300°; ### 飽和度S 飽和度S表示顏色接近光譜色的程度。一種顏色,可以看成是某種光譜色與白色混合的結果。 其中光譜色所佔的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高。 飽和度高,顏色則深而豔。光譜色的白光成分為0,飽和度達到最高。通 常取值範圍為0%~100%,值越大,顏色越飽和。 ### 明度V 明度表示顏色明亮的程度,對於光源色,明度值與發光體的光亮度有關;對於物體色,此值和物體的透射比或反射比有關。通常取值範圍為0%(黑)到100%(白)。 RGB和CMY顏色模型都是面向硬件的,而HSV(Hue Saturation Value)顏色模型是面向用户的。 HSV模型的三維表示從RGB立方體演化而來。設想從RGB沿立方體對角線的白色頂點向黑色頂點觀察,就可以看到立方體的六邊形外形。六邊形邊界表示色彩,水平軸表示純度,明度沿垂直軸測量。 ## 六稜錐 ![](https://i.imgur.com/6qM3xQz.jpg) H參數表示色彩信息,即所處的光譜顏色的位置。該參數用一角度量來表示,紅、綠、藍分別相隔120度。互補色分別相差180度。 純度S為一比例值,範圍從0到1,它表示成所選顏色的純度和該顏色最大的純度之間的比率。S=0時,只有灰度。 V表示色彩的明亮程度,範圍從0到1。有一點要注意:它和光強度之間並沒有直接的聯繫。 ## RGB轉化到HSV的算法: max=max(R,G,B); min=min(R,G,B); V=max(R,G,B); S=(max-min)/max; HSV顏色空間模型(圓錐模型) HSV顏色空間模型(圓錐模型) if (R = max) H =(G-B)/(max-min)* 60; if (G = max) H = 120+(B-R)/(max-min)* 60; if (B = max) H = 240 +(R-G)/(max-min)* 60; if (H < 0) H = H+ 360; ## HSV轉化到RGB的算法: if (s = 0) R=G=B=V; else H /= 60; i = INTEGER(H); f = H - i; a = V * ( 1 - s ); b = V * ( 1 - s * f ); c = V * ( 1 - s * (1 - f ) ); switch(i) case 0: R = V; G = c; B = a; case 1: R = b; G = v; B = a; case 2: R = a; G = v; B = c; case 3: R = a; G = b; B = v; case 4: R = c; G = a; B = v; case 5: R = v; G = a; B = b; ### HSV對用户來説是一種直觀的顏色模型。 我們可以從一種純色彩開始,即指定色彩角H,並讓V=S=1, 然後我們可以通過向其中加入黑色和白色來得到我們需要的顏色。 增加黑色可以減小V而S不變,同樣增加白色可以減小S而V不變。 例如,要得到深藍色,V=0.4 S=1 H=210度。 要得到淡藍色,V=1 S=0.4 H=210度。 一般説來,人眼最大能區分128種不同的色彩,130種色飽和度,23種明暗度。 如果我們用16Bit表示HSV的話,可以用7位存放H,4位存放S,5位存放V,即745或者655就可以滿足我們的需要了。 由於HSV是一種比較直觀的顏色模型,所以在許多圖像編輯工具中應用比較廣泛, 如Photoshop(在Photoshop中叫HSB)等等,但這也決定了它不適合使用在光照模型中, 許多光線混合運算、光強運算等都無法直接使用HSV來實現。 順便提一下,另外一種直觀顏色模型是HSL模型, 該模型中前兩個參數和HSV一樣,而L表示亮度。它的三維表示為一雙稜錐。 ### HSL 比較 HSV HSL 類似於 HSV。對於一些人,HSL 更好的反映了“飽和度”和“亮度”作為兩個獨立參數的直覺觀念, 但是對於另一些人,它的飽和度定義是錯誤的, 因為非常柔和的幾乎白色的顏色在 HSL 可以被定義為是完全飽和的。 對於 HSV 還是 HSL 更適合於人類用户界面是有爭議的。 W3C的CSS3 規定聲稱“HSL 的優點是它對稱於亮與暗(HSV 就不是這樣)…”,這意味着: 在 HSL 中,飽和度分量總是從完全飽和色變化到等價的灰色(在 HSV 中, 在極大值 V 的時候,飽和度從全飽和色變化到白色,這可以被認為是反直覺的)。 在 HSL 中,亮度跨越從黑色過選擇的色相到白色的完整範圍(在 HSV 中,V 分量只走一半行程,從黑到選擇的色相)。 在軟體中,通常以一個線性或圓形色相選擇器和在其中為選定的色相選取飽和度和明度/亮度的一個二維區域(通常為方形或三角形) 形式提供給用户基於色相的顏色模型(HSV 或 HSL)。 通過這種表示,在 HSV 和 HSL 之間的區別就無關緊要了。 但是很多程序還允許你通過Trackbar或數值錄入框來選擇顏色的明度/亮度 而對於這些控件通常使用要麼 HSL 要麼 HSV(而非二者)。HSV 傳統上更常用。 ![](https://i.imgur.com/zCqmdu2.jpg) [來源](https://baike.baidu.hk/item/HSV/547122) ::: ## 影片循環播放 ```javascript= import cv2 import numpy as np frameWidth = 240 frameHeight = 240 cap = cv2.VideoCapture("2.mp4") //初設值要放在LOOP外 frame_counter = 0 //初設值要放在LOOP外 while True: _ , img = cap.read //每次循環加1 frame_counter += 1 if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)): frame_counter = 0 cap.set(cv2.CAP_PROP_POS_FRAMES, 0) //每次循環加1 img = cv2.resize(img, (frameWidth, frameHeight)) imgHsv = cv2.cvtColor(img , cv2.COLOR_BGR2HSV) cv2.imshow('Original', img) cv2.imshow('imgHsv', imgHsv) //結尾 key = cv2.waitKey(1) if key == 2: break //結尾 cap.release() cv2.destroyAllWindows() ``` ![](https://i.imgur.com/oLxOPrL.png) ## Creat Trackbar ```javascript= import cv2 import numpy as np frameWidth = 240 frameHeight = 240 cap = cv2.VideoCapture("2.mp4") def empty(a): pass cv2.namedWindow("HSV") cv2.resizeWindow("HSV",640 ,240) cv2.createTrackbar("HUEMin", "HSV", 0 , 179 ,empty) cv2.createTrackbar("HUE Max", "HSV", 179 , 179 ,empty) cv2.createTrackbar("SAT Min", "HSV", 0 , 255 ,empty) cv2.createTrackbar("SAT Max", "HSV", 255 , 255 ,empty) cv2.createTrackbar("Value Min", "HSV", 0 , 255 ,empty) cv2.createTrackbar("Value Max", "HSV", 255 , 255 ,empty) frame_counter = 0 while True: _ , img = cap.read() frame_counter += 1 if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)): frame_counter = 0 cap.set(cv2.CAP_PROP_POS_FRAMES, 0) img = cv2.resize(img, (frameWidth, frameHeight)) imgHsv = cv2.cvtColor(img , cv2.COLOR_BGR2HSV) cv2.imshow('Original', img) cv2.imshow('imgHsv', imgHsv) key = cv2.waitKey(1) if key == 2: break cap.release() cv2.destroyAllWindows() ``` ![](https://i.imgur.com/QuqSRIa.png) ## 除去影片背景(mask) ```javascript= import cv2 import numpy as np frameWidth = 240 frameHeight = 240 cap = cv2.VideoCapture("1.mp4") def empty(a): pass cv2.namedWindow("HSV") cv2.resizeWindow("HSV", 320 , 240) cv2.createTrackbar("HUE min" , "HSV" , 0 , 179 , empty) cv2.createTrackbar("HUE Max" , "HSV" , 179 , 179 , empty) cv2.createTrackbar("SAT min" , "HSV" , 0 , 255 , empty) cv2.createTrackbar("SAT Max" , "HSV" , 255 , 255 , empty) cv2.createTrackbar("Value min" , "HSV" , 0 , 255 , empty) cv2.createTrackbar("Value Max" , "HSV" , 255 , 255 , empty) frame_counter = 0 while True: _, img = cap.read() frame_counter += 1 if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)): frame_counter = 0 cap.set(cv2.CAP_PROP_POS_FRAMES, 0) img = cv2.resize(img, (frameWidth, frameHeight)) imgHsv = cv2.cvtColor(img , cv2.COLOR_BGR2HSV) h_min = cv2.getTrackbarPos("HUE min", "HSV") h_Max = cv2.getTrackbarPos("HUE Max", "HSV") s_min = cv2.getTrackbarPos("SAT min", "HSV") s_Max = cv2.getTrackbarPos("SAT Max", "HSV") v_min = cv2.getTrackbarPos("Value min", "HSV") v_Max = cv2.getTrackbarPos("Value Max", "HSV") print(h_min) lower = np.array([h_min, s_min, v_min]) upper = np.array([h_Max, s_Max, v_Max]) mask = cv2.inRange(imgHsv,lower,upper) result = cv2.bitwise_and(img, img , mask = mask) cv2.imshow('Original', img) cv2.imshow('imgHsv', imgHsv) cv2.imshow('Mask', mask) cv2.imshow('Result', result) key = cv2.waitKey(1) if key == 2: break cap.release() cv2.destroyAllWindows() ``` 10.png ![](https://i.imgur.com/KviXtzw.png) ## 建立水平視窗 ```javascript= import cv2 import numpy as np frameWidth = 240 frameHeight = 240 cap = cv2.VideoCapture("2.mp4") def empty(a): pass cv2.namedWindow("HSV") cv2.resizeWindow("HSV", 320 , 240) cv2.createTrackbar("HUE min" , "HSV" , 0 , 179 , empty) cv2.createTrackbar("HUE Max" , "HSV" , 179 , 179 , empty) cv2.createTrackbar("SAT min" , "HSV" , 0 , 255 , empty) cv2.createTrackbar("SAT Max" , "HSV" , 255 , 255 , empty) cv2.createTrackbar("Value min" , "HSV" , 0 , 255 , empty) cv2.createTrackbar("Value Max" , "HSV" , 255 , 255 , empty) frame_counter = 0 while True: _, img = cap.read() frame_counter += 1 if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)): frame_counter = 0 cap.set(cv2.CAP_PROP_POS_FRAMES, 0) img = cv2.resize(img, (frameWidth, frameHeight)) imgHsv = cv2.cvtColor(img , cv2.COLOR_BGR2HSV) h_min = cv2.getTrackbarPos("HUE min", "HSV") h_Max = cv2.getTrackbarPos("HUE Max", "HSV") s_min = cv2.getTrackbarPos("SAT min", "HSV") s_Max = cv2.getTrackbarPos("SAT Max", "HSV") v_min = cv2.getTrackbarPos("Value min", "HSV") v_Max = cv2.getTrackbarPos("Value Max", "HSV") print(h_min) lower = np.array([h_min, s_min, v_min]) upper = np.array([h_Max, s_Max, v_Max]) mask = cv2.inRange(imgHsv,lower,upper) result = cv2.bitwise_and(img, img , mask = mask) mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) hstack = np.hstack([img, mask ,result]) #cv2.imshow('Original', img) #cv2.imshow('imgHsv', imgHsv) #cv2.imshow('Mask', mask) #cv2.imshow('Result', result) cv2.imshow('Hstacking',hstack) key = cv2.waitKey(1) if key == 2: break cap.release() cv2.destroyAllWindows() ``` ![](https://i.imgur.com/hnhFgng.png) :::spoiler 一篇一個OpenCV函式(bitwise_or-and-xor-not) ![](https://i.imgur.com/dZlYch9.png) https://www.wongwonggoods.com/python/python_opencv/opencv-bitwise_or-and-xor-not/ ::: :::spoiler 一篇一個numpy函式() ```javascript= // ``` https://hackmd.io/@yillkid/rJp5h90s8/https%3A%2F%2Fhackmd.io%2F%40yillkid%2FHy5a_5A-F#array ::: ### ![](https://i.imgur.com/zX6VKS3.png)