2010-06-03 66 views
3

我正在從網絡攝像頭下傳一些數據。當我獲得完整圖像的全部字節時(在一個名爲byteString的字符串中),我想使用OpenCV顯示圖像。完成速度足夠快,這將從網絡攝像頭「流」視頻到OpenCV窗口。從Python字符串到OpenCV的IplImage?

這就是我對我所做的設置窗口:

cvNamedWindow('name of window', CV_WINDOW_AUTOSIZE)

而這裏的字節串完成後,我做的:

IMG = cvCreateImage(IMG_SIZE,PIXEL_DEPTH,渠道)
BUF = ctypes.create_string_buffer(字節字符串) img.imageData = ctypes.cast(BUF,ctypes.POINTER(ctypes.c_byte)) cvShowImage( '窗口的名稱',IMG) cvWaitKey(0)

出於某種原因,這是產生一個錯誤:

文件 「C:\ Python26 \ LIB \站點包\ ctypes_opencv \ highgui_win32.py」,線路226,在執行 回報FUNC(* ARGS,* * kwargs)

WindowsError: exception: access violation reading 0x015399E8

有誰知道該怎麼做我想要做/如何解決這個瘋狂的衝突錯誤?

回答

0

泰勒:

我不知道你想do..i有一些猜測什麼。

,如果你想簡單地讀取連接到您的電腦攝像頭的圖像,然後這個代碼應工作:

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

如果由於某種原因,你不能在任何的這些方式做到這一點則可能是你可以以某種方式在硬盤上,然後savethe圖像加載它在你的OpenCV程序通過做一個簡單的cvLoadImage(當然這種方式要慢得多)。

另一種方法是通過讀取每個值從字節串,做這樣的事情來設置用手新的圖像像素:

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版本。

2

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

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

然後我得到了JPEG的字節,所以我只需使用open(...)方法創建一個新的Cv圖像,並將其傳遞給包裝在StringIO類中的字節字符串。

+0

你可以提供關於你的解決方案的更多細節,我的意思是,代碼段,我有類似的問題。 – omar 2012-08-14 00:18:36