编辑:第一个答案解决了我的问题。除此之外,我必须将ASI_BANDWIDTH_OVERLOAD值设置为0.从相机Qt视频帧损坏
我正在使用C++/Qt 5.7编写Linux应用程序来跟踪我望远镜中的恒星。我使用相机(ZWO ASI 120MM,根据SDK v0.3),并在一个单独的线程中在一个while循环中抓取帧。然后这些被发送到一个QOpenGlWidget被显示。我有以下问题:当鼠标位于QOpenGlWidget区域内时,显示的帧被损坏。特别是当鼠标移动时。当我使用50ms的曝光时间时,问题最严重,并且曝光时间较短时消失。当我通过磁盘交替传输图像给管道时,问题就消失了。我认为这是摄像头线程和主线程之间的某种线程同步问题,但我无法解决它。 openastro软件出现同样的问题。下面是代码的部分:
主窗口:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
mutex = new QMutex;
camThread = new QThread(this);
camera = new Camera(nullptr, mutex);
display = new GLViewer(this, mutex);
setCentralWidget(display);
cameraHandle = camera->getHandle();
connect(camThread, SIGNAL(started()), camera, SLOT(connect()));
connect(camera, SIGNAL(exposureCompleted(const QImage)), display, SLOT(showImage(const QImage)), Qt::BlockingQueuedConnection);
camera->moveToThread(camThread);
camThread->start();
}
,抓住帧例程:
void Camera::captureFrame(){
while(cameraIsReady && capturing){
mutex->lock();
error = ASIGetVideoData(camID, buffer, bufferSize, int(exposure*2*1e-3)+500);
if(error == ASI_SUCCESS){
frame = QImage(buffer,width,height,QImage::Format_Indexed8).convertToFormat(QImage::Format_RGB32); //Indexed8 is for 8bit
mutex->unlock();
emit exposureCompleted(frame);
}
else {
cameraStream << "timeout" << endl;
mutex->unlock();
}
}
}
接收图像槽:
bool GLViewer::showImage(const QImage image)
{
mutex->lock();
mOrigImage = image;
mRenderQtImg = mOrigImage;
recalculatePosition();
updateScene();
mutex->unlock();
return true;
}
而GL功能设置图像:
void GLViewer::renderImage()
{
makeCurrent();
glClear(GL_COLOR_BUFFER_BIT);
if (!mRenderQtImg.isNull())
{
glLoadIdentity();
glPushMatrix();
{
if (mResizedImg.width() <= 0)
{
if (mRenderWidth == mRenderQtImg.width() && mRenderHeight == mRenderQtImg.height())
mResizedImg = mRenderQtImg;
else
mResizedImg = mRenderQtImg.scaled(QSize(mRenderWidth, mRenderHeight),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation);
}
glRasterPos2i(mRenderPosX, mRenderPosY);
glPixelZoom(1, -1);
glDrawPixels(mResizedImg.width(), mResizedImg.height(), GL_RGBA, GL_UNSIGNED_BYTE, mResizedImg.bits());
}
glPopMatrix();
glFlush();
}
}
我偷了这个代码从这里:https://github.com/Myzhar/QtOpenCVViewerGl
最后,这里是我的问题的样子:
感谢您发表这样一个详细的答案!这比我期待的要多得多:) – MonsterMax