我正在从网络摄像头传输一些数据。当我获得完整图像的所有字节(在一个名为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('窗口名称',img)
cvWaitKey(0)
出于某种原因,这会产生错误:
文件“C:\ Python26 \ lib \ site-packages \ ctypes_opencv \ highgui_win32.py”,第226行,执行中 return func(* args,** kwargs)
WindowsError: exception: access violation reading 0x015399E8
有人知道如何做我正在尝试做的事情/如何解决这个疯狂的违规错误吗?
答案 0 :(得分:2)
我实际上已经解决了这个问题而忘了发布解决方案。这是我如何做到的,虽然它可能不完全健壮:
我分析了来自我正在做的网络摄像机的MJPEG的标头,然后我只是一次从流中读取1个字节,当我检测到下一个图像的标题也在bytestring,我关闭了最后42个字节(因为这是标题的长度)。
然后我有JPEG的字节,所以我只是通过使用open(...)方法创建一个新的Cv Image,并将包含在StringIO类中的字节字符串传递给它。
答案 1 :(得分:0)
泰勒:
我不确定你要做什么..我有一些猜测。
如果您只是想从连接到电脑的网络摄像头中读取图像,那么此代码应该有效:
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版本。