使用 Qt 显示相机图像给出 HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

Posted

技术标签:

【中文标题】使用 Qt 显示相机图像给出 HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP【英文标题】:Show camera image with Qt gives HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP 【发布时间】:2015-03-21 11:02:50 【问题描述】:

我试图在我的 qlabel 上看到摄像头,但即使我在 opencv 窗口中也看不到它。启动应用程序后,opencv 创建了一个小窗口,但没有图像。在日志中我可以看到错误:

HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

(<unknown>:7534): Gtk-WARNING **: gtk_disable_setlocale() must be called before gtk_init()
In capture... 
Corrupt JPEG data: 1 extraneous bytes before marker 0xd9
Corrupt JPEG data: 1 extraneous bytes before marker 0xd9
Corrupt JPEG data: 1 extraneous bytes before marker 0xd9

这是我的简单代码:

void MainWindow::on_pushButton_clicked()

    CvCapture* capture = 0;
    cv::Mat frame, frameCopy;

    capture = cvCaptureFromCAM(CV_CAP_ANY); //0=default, -1=any camera, 1..99=your camera
    if(!capture)
    
        qDebug() << "No camera detected";
       

    if( capture )
    
        qDebug() << "In capture...";

        for(;;)
        
            IplImage* iplImg = cvQueryFrame( capture );
            frame = iplImg;
            if( frame.empty() )
                break;
            if( iplImg->origin == IPL_ORIGIN_TL )
                frame.copyTo( frameCopy );
            else
                flip( frame, frameCopy, 0 );

            if( cv::waitKey( 10 ) >= 0 )
                break;
            cv::imshow("result", frameCopy);
        
    
    //    cv::waitKey(0);

    cvReleaseCapture(&capture);
    cvDestroyWindow("result");


您能否告诉我,为什么会出现 HIGHGUI 错误以及如何解决?

【问题讨论】:

【参考方案1】:

您的相机中的数据已损坏。所以jpeg解码器无法解码。您可以尝试增加 cvWaitKey() 的持续时间。

我希望它对你有用。

【讨论】:

以上是关于使用 Qt 显示相机图像给出 HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP的主要内容,如果未能解决你的问题,请参考以下文章

相机标定与图像校正助手(VS+OpenCV+Qt实现)

HighGUI图形图像界面初步—— 图像的载入显示与输出

使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据

如何使用 Qt/C++ 小部件(不是 QML)从 Android 相机获取图像

Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)

Imagelab-0-QT label显示 opencv 图像