从字节串到Python中的OpenCV的IplImage?

时间:2010-06-03 22:20:11

标签: python string image opencv byte

我正在从网络摄像头传输一些数据。当我获得完整图像的所有字节(在一个名为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

有人知道如何做我正在尝试做的事情/如何解决这个疯狂的违规错误吗?

2 个答案:

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