我做了一个代码,在不同的QWidgets上运行不同的OpenCV算法。所以我有3个标签,每个标签都应该显示一个摄像头实时流媒体与他们的处理。我在第一个选项卡小部件上捕获视频,并通过全局引用将其传递给其他选项卡……然而,我得到了这个问题
libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT
尽管我只捕获了一次..
有什么想法吗?
发布于 2012-02-22 15:58:16
处理此问题的正确方法是复制由camera检索到的帧,并使其可用于其他选项卡。请勿使用共享capture
接口!
发布于 2012-02-22 16:41:31
我也在使用OpenCV和Qt。为了模拟摄像机,我使用Capture对象从视频文件中读取帧,并通过TCP/IP发送它们。
要使您的框架对所有其他小部件可用,我建议您创建一个继承自QIODevice的新类,初始化捕获设备。每次从相机获取新帧时,都会将数据保存到QByteArray变量中并发出readyRead()信号。
注意:-您的所有小部件都必须连接到readyRead()信号-一旦您获得新的帧,请记住清除以前的数据-您必须重新实现函数virtual qint64 readData( char * data, qint64 maxSize )
才能读取数据
像这样的东西
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
class VideoCaptureDevice : public QIODevice
{
Q_OBJECT
public:
VideoCaptureDevice(QObject *parent);
virtual ~VideoCaptureDevice();
private:
VideoCapture m_capture;
QByteArray m_receivedData;
protected:
// from QIODevice
qint64 writeData(const char * data, qint64 maxSize);
qint64 readData(char * data, qint64 maxSize);
};
https://stackoverflow.com/questions/9395633
复制