我正在嘗試使用 OpenCV Python 處理來自 Unity3D WebCamTexture 圖形格式(ARGB32)的影像。但是我無法解釋 Open CV 方面的影像。影像全是藍色(可能是由于 ARGB)
try:
while(True):
data = sock.recv(480 * 640 * 4)
if(len(data) == 480 * 640 * 4):
image = numpy.fromstring(data, numpy.uint8).reshape( 480, 640, 4 )
#imageNoAlpha = image[:,:,0:2]
cv2.imshow('Image', image) #further do image processing
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
finally:
sock.close()

uj5u.com熱心網友回復:
原因是因為通道的順序。我認為發件人將影像讀取為 RGB 影像,而您將其顯示為 BGR 影像,反之亦然。改變R和B通道的順序可以解決問題:
image = image[..., [0,3,2,1]] # swap 3 and 1 represent for B and R
如果您使用PIL.Image和 ,您將經常遇到此問題OpenCV。在PIL.Image將讀取影像RGB和cv2將讀為BGR,這就是為什么所有影像的紅點變成藍色。
uj5u.com熱心網友回復:
OpenCV 在處理彩色影像時使用 BGR(包括 alpha 時為 BGRA)排序 [1][2],這適用于使用imread(),讀取/寫入的影像imwrite();獲得的影像VideoCapture;繪圖功能ellipse(),rectangle();等等。這個約定在庫中是自洽的,如果你用 閱讀影像imread()并用 顯示它imshow(),就會出現正確的顏色。
OpenCV 是我知道的唯一使用這種排序的庫,例如 PIL 和 Matplotlib 都使用 RGB。如果您想從一種色彩空間轉換為另一種色彩空間cvtColor(),例如:
# Convert RGB to BGR.
new_image = cvtColor(image, cv2.COLOR_RGB2BGR)
查看ColorConversionCodes所有支持的轉換對的列舉。不幸的是,沒有 ARGB 到 BGR,但您始終可以手動操作 NumPy 陣列:
# Reverse channels ARGB to BGRA.
image_bgra = image[..., ::-1]
# Convert ARGB to BGR.
image_bgr = image[..., [3, 2, 1]]
還有一個mixChannels()函式和一堆其他陣列操作實用程式,但其中大部分在 OpenCV Python 中都是多余的,因為影像由 NumPy 陣列支持,因此更容易使用 NumPy 對應物。
OpenCV 使用 BGR 似乎是出于歷史原因:為什么 OpenCV 使用 BGR 色彩空間而不是 RGB。
參考:
[1] OpenCV:Mat - 基本影像容器(在存盤方法下搜索“BGR” 。)
[2] OpenCV:如何使用 OpenCV 掃描影像、查找表和時間測量
來自 [2] 的影像顯示了記憶體中的 BGR 布局。
uj5u.com熱心網友回復:
IMAGE_WIDTH = 640
IMAGE_HEIGHT = 480
IMAGE_SIZE = IMAGE_HEIGHT * IMAGE_WIDTH * 4
try:
while(True):
data = sock.recv(IMAGE_SIZE)
dataLen = len(data)
if(dataLen == IMAGE_SIZE):
image = numpy.fromstring(data, numpy.uint8).reshape(IMAGE_HEIGHT, IMAGE_WIDTH, 4)
imageDisp = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
cv2.imshow('Image', imageDisp)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
finally:
sock.close()
根據評論中的建議進行編輯
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325925.html
標籤:Python 蟒蛇-3.x 麻木的 opencv opencv-python
下一篇:Rasterio創建TIFF檔案
