2016-09-22 46 views
1

我試圖用OpenCV2和Python3將圖像的一部分作爲黑色和白色來繪製。這是我想要的代碼:使用打開的CV和Python製作圖像輪廓黑白使用

(x, y, w, h) = cv2.boundingRect(c) 
cv2.rectangle(frame, (x,y), (x+w,y+h),0,0) 
sub_face = frame[y:y+h, x:x+w] 
# apply a gaussian blur on this new recangle image 
# sub_face = cv2.GaussianBlur(sub_face,(9, 9), 30, borderType = 0) 
sub_face = cv2.cvtColor(sub_face, cv2.COLOR_BGR2GRAY) 

# merge this blurry rectangle to our final image 
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face 

當我申請的高斯模糊方法,它工作正常,但是當我嘗試cvtColor方法失敗與消息(最後一行):不能播出輸入從形狀(268,182)排列成形(268,182,3)。我究竟做錯了什麼?

c變量在第一行是輪廓(來自運動檢測)。

我是Python和OpenCV的新手。

謝謝!

回答

2

您試圖指派,從您的cv2.cvtColor通話效果三個通道在一次作爲result_frame是RGB /三通道圖像中的一個通道。您可能想要將單個頻道分配給所有三個頻道。乾淨利落的一種方法是利用NumPy broadcasting,在第三維中創建一個單獨通道,然後在所有通道上廣播結果。由於正在使用的cv2接口OpenCV的,用於處理圖像的本地數據類型是一個NumPy的數組:

# merge this blurry rectangle to our final image 
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face[:,:,None] 

在本上下文中:操作訪問在特定維數的所有值。在這種情況下,我們需要第一個和第二個維度。因此,sub_face[:,:,None]將使您的單通道圖像3D的第三維爲單例(即1)。然後使用NumPy廣播將這個單一頻道圖像同時廣播到所有頻道

請注意,在分配到result_frame時,我不必明確地訪問第三個維度。這是因爲result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]]result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1],:]與您在指定的最後一個維隱含地假定:後刪除索引相同。

+1

謝謝,它的工作! :) –

+0

@GorgiRankovski不客氣!祝你好運 :) – rayryeng

0

您將sub_face轉換爲單通道圖像,但result_frame是3通道圖像。

在最後一行中,您嘗試將單個通道數組分配給3通道片。

你可以這樣做:

result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 0] = sub_face 
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 1] = sub_face 
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 2] = sub_face 
+0

是的,這就是我從錯誤消息中得出的結論:) 但是,我是Python和OpenCV的新手,所以不知道如何做到這一點。 –