簡體   English   中英

從字節串到Python中的OpenCV的IplImage?

[英]from string of bytes to OpenCV's IplImage in Python?

我正在從網絡攝像頭傳輸一些數據。 當我得到一個完整圖像的所有字節(在一個名為byteString的字符串中)時,我想使用OpenCV顯示圖像。 完成得足夠快,這將從網絡攝像頭“流”視頻到OpenCV窗口。

這是我為設置窗口所做的工作:

cvNamedWindow('name of window', CV_WINDOW_AUTOSIZE)

以下是字節字符串完成時的操作:

img = cvCreateImage(IMG_SIZE,PIXEL_DEPTH,CHANNELS)
buf = ctypes.create_string_buffer(byteString)img.imageData = ctypes.cast(buf,ctypes.POINTER(ctypes.c_byte))cvShowImage('name of window',img)cvWaitKey(0)

由於某種原因,這會產生錯誤:

文件“C:\\ Python26 \\ lib \\ site-packages \\ ctypes_opencv \\ highgui_win32.py”,第226行,執行返回函數(* args,** kwargs)

WindowsError: exception: access violation reading 0x015399E8

有誰知道如何做我正在嘗試做的事情/如何解決這個瘋狂的違規錯誤?

我實際上解決了這個問題而忘了發布解決方案。 這是我如何做到的,雖然它可能不完全健壯:

我分析了來自我正在做的網絡攝像機的MJPEG的標題,然后我一次只讀取1字節的流,當我檢測到下一個圖像的標題也在字節串中時,我關閉最后42個字節(因為這是標題的長度)。

然后我有JPEG的字節,所以我只是通過使用open(...)方法創建一個新的Cv圖像,並傳遞包裝在StringIO類中的字節字符串。

泰勒:

我不確定你要做什么..我有一些猜測。

如果您只想從連接到PC的網絡攝像頭讀取圖像,則此代碼應該可以正常工作:

import cv

cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    if cv.WaitKey(10) == 27:
        break

你想從網絡攝像頭流式傳輸視頻嗎? 如果是這樣,你應該查看另一篇文章: opencv-with-network-cameras

如果由於某種原因你不能以這些方式做到這一點,那么你可以以某種方式將圖像保存在硬盤驅動器上,然后通過做一個簡單的cvLoadImage將它加載到你的opencv程序中(當然這種方式要慢得多)。

另一種方法是通過讀取byteString中的每個值手動設置新圖像像素,執行如下操作:

for(int x=0;x<640;x++){
                for(int y=0;y<480;y++){
                        uchar * pixelxy=&((uchar*) (img->imageData+img->widthStep*y))[x];
                        *pixelxy=buf[y*img->widthStep + x]; 
                }
        }

這也比使用硬盤更慢但更快。 無論如何,希望其中一些有用,你還應該指定你使用的opencv版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM