我正在通过网络摄像头捕获视频,该网络摄像头提供了一个mjpeg流.我在工作线程中进行了视频捕获.我像这样开始捕获:
const std::string videoStreamAddress = "http://192.168.1.173:80/live/0/mjpeg.jpg?x.mjpeg";
qDebug() << "start";
cap.open(videoStreamAddress);
qDebug() << "really started";
cap.set(CV_CAP_PROP_FRAME_WIDTH, 720);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 576);
Run Code Online (Sandbox Code Playgroud)
摄像机以20fps的速度输入流.但是,如果我像这样以20fps读取:
if (!cap.isOpened()) return;
Mat frame;
cap >> frame; // get a new frame from camera
mutex.lock();
m_imageFrame = frame;
mutex.unlock();
Run Code Online (Sandbox Code Playgroud)
然后有3秒多的延迟.原因是捕获的视频首先存储在缓冲区中.当我第一次启动摄像机时,缓冲区被累积但我没有读出帧.所以如果我从缓冲区读取它总是给我旧帧.我现在唯一的解决方案是以30fps的速度读取缓冲区,这样它就可以快速清理缓冲区并且没有更严重的延迟.
有没有其他可能的解决方案,以便每次启动相机时我都可以手动清理/刷新缓冲区?
我正在调试Qt应用程序.我在哪里可以找到Qt的调试DLL?我在Windows上使用vs2010.它说它需要来自Qt的许多.dll的pdb文件.
假设我创建了一个QObject a,它有一个成员QObject b.(实际上,A和B都是QObject的子类,而A类是成员B. b)
当b被创建,其母公司为0(默认值).在代码中,如果我从未设置b父级a,并且如果我调用movetothread()移动a到工作线程,那么它也会b被移入该线程吗?
如果它没有被移动,如果我b.init()从工作线程(我移入的a那个)调用哪个使用new运算符来创建另一个b作为父节点的QObject ,那么我将得到以下错误,对吧?
QObject:无法为位于不同线程中的父级创建子级
Qt的文档说明如下:
由于隐式共享,函数返回每个值的容器非常便宜.Qt API包含许多函数,每个值返回一个QList或QStringList(例如,QSplitter :: sizes()).如果要使用STL迭代器迭代这些,则应始终获取容器的副本并遍历副本.例如:
// RIGHT
const QList<int> sizes = splitter->sizes();
QList<int>::const_iterator i;
for (i = sizes.begin(); i != sizes.end(); ++i)
...
// WRONG
QList<int>::const_iterator i;
for (i = splitter->sizes().begin();
i != splitter->sizes().end(); ++i)
...
Run Code Online (Sandbox Code Playgroud)
如果应用'错误'方法会发生什么?
我有一节课:
class centralDataPool : public QObject
{
Q_OBJECT
public:
centralDataPool(QObject * parent = 0);
~centralDataPool();
commMonitor commOverWatch;
private:
QThread monitorThread;
int totalNum;
signals:
void createMonitor(int);
};
Run Code Online (Sandbox Code Playgroud)
在它的构造函数中我做了:
centralDataPool::centralDataPool(QObject* parent) : QObject(parent),totalNum(0)
{
connect(this, SIGNAL(createMonitor(int)), &commOverWatch, SLOT(createMonitor(int)));
commOverWatch.moveToThread(&monitorThread);
monitorThread.start();
}
Run Code Online (Sandbox Code Playgroud)
当我调用此类的析构函数时,我收到错误消息:
qthread destroyed while thread is still running
Run Code Online (Sandbox Code Playgroud)
但是当我试图在类centralDataPool的析构函数中终止monitorThread时,
centralDataPool::~centralDataPool()
{
monitorThread.terminate();
}
Run Code Online (Sandbox Code Playgroud)
我得到内存泄漏.
在销毁其所有者对象期间终止线程的正确方法是什么?
是否可以设置超时QNetworkReply,因此很长一段时间没有来自服务器的回复,它可以发出finished()信号?
我没有看到任何信号/插槽/功能可以告诉我鼠标是否选中了小部件?有没有可能有这样的功能告诉我当前的QWidget是否被选中?我如何区分"当前小部件被选中"和"其中一个子小部件被选中?"
在 qt4.8 中,仍然存在 qhttp 类,我可以http->hasPendingRequests()用来检查是否还有待处理的请求。但是在qt5中,我们被迫使用QNetworkAccessManager类来管理http链接。我怎么能实现这个检查?
该文档将该QSettings::clear功能描述为:
删除与此 QSettings 对象关联的主要位置中的所有条目。
回退位置中的条目不会被删除。
但是,这是什么意思?主要位置和后备位置是什么???
我最近从QGLWidget切换到新的QOpenGlWidget,因为后者缺少renderText()函数.我正在考虑使用QPainter在我的openGL 3D图形上绘制一些文本.
我最初通过paintGL()函数渲染所有内容,如何在该函数中安全地添加QPainter?
我的代码是这样的:
paintGL()
{
//Raw OpenGL codes
//....
//Where to safely use the QPainter?
}
Run Code Online (Sandbox Code Playgroud)