使用OpenCV和Qt显示图像时出现异常行为

4
我正在使用OpenCV C API从摄像头捕获图像,并使用TCP套接字发送它们。
服务器运行C++(QT)并接收帧。
该过程正常工作,我可以在服务器上看到图像。
奇怪的问题是,当我关闭客户端和服务器并重新运行它们时,我会再次看到先前测试中看到的上一帧。
如果我再次关闭两个程序并重新运行它们,我会看到一个新的帧而不是第二个帧,进程继续。
更明确地说:
capture1、关闭、cap1、关闭、cap3、关闭、cap3、关闭、cap5......等等
我以前没有见过这样的情况!

你是否正在使用任何临时存储,例如持续时间超过预期的文件? - Vinícius Gobbo A. de Oliveira
无需临时存储,直接从相机中获取。 - Ahmed Kato
你如何捕获/释放帧?你如何发送/接收帧?(这是可能发生缓冲的2个位置)。你能粘贴相关的代码片段吗? - Eran
好的,我正在尝试编写一个简单的代码来证明这个概念。(我的代码很庞大) - Ahmed Kato
你尝试在另一台机器上启动服务器了吗?这样我们就可以排除摄像头驱动程序和其他平台特定性。 - Vinícius Gobbo A. de Oliveira
没有源代码,我们将永远在猜测中挣扎。只要不要忘记在程序末尾释放捕获接口。 - karlphillip
3个回答

2

我之前也遇到过同样的问题。

帧大小可能比较大,而且你可能是以随机方式从缓冲区读取(只是猜测),你需要在相机和OpenCV之间设置一个定时器或确认信号。

尝试控制相机捕获帧的方式。


1

我不太了解TCP/IP编程或客户端/服务器...但我能建议的是在相机/客户端/服务器类的构造函数中初始化图像。

    Mat Frame = Mat::zeros(rows,cols,CV_8UC3);

每次客户端/服务器初始化或者在你准备交换图像之前,启动图像是一个空白图像。
你必须使用cvCreateImage()进行初始化...这样你就可以做以下处理...
IplImage *m = cvCreateImage(cvSize(200,200),8,3);// say its 200 x 200
cvZero(m);
cvShowImage("BLANK",m);
cvvWaitKey();

这将显示一个黑色图像,其中每个像素为零...


实际上,我正在服务器上构建图像,每次初始化新的IplImage。 - Ahmed Kato
不,它给了我一个异常:未知的数组类型。 - Ahmed Kato

1
当然,这个问题与相机有关。似乎相机必须在抓取一帧后接收到任何确认。您可以尝试的一件事是转到发送图像的代码行,并将图像保存在磁盘中,以检查是否发送了两次cap1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接