Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用Visual studio将OpenCV图像查看窗口推送到QT GUI中?_C++_Visual Studio 2010_Qt_Opencv - Fatal编程技术网

C++ 如何使用Visual studio将OpenCV图像查看窗口推送到QT GUI中?

C++ 如何使用Visual studio将OpenCV图像查看窗口推送到QT GUI中?,c++,visual-studio-2010,qt,opencv,C++,Visual Studio 2010,Qt,Opencv,我想创建一个GUI,其中有两个矩形用于查看视频(一个用于查看输入视频,另一个用于查看后处理视频) 我希望将其集成到QT制作的GUI中,但我希望这些视频区域是从OpenCV填充的,作为OpenCV的cv::nameWindow方法的替代方法 我如何才能做到这一点?实现您的愿望的基本工作流程是: 使用OpenCV API打开视频(例如,cvCreateFileCapture) 从视频抓取IplImage帧(cvQueryFrame) 将其转换为QImage(见下面的附加代码) 在QLabel(QLa

我想创建一个GUI,其中有两个矩形用于查看视频(一个用于查看输入视频,另一个用于查看后处理视频)

我希望将其集成到QT制作的GUI中,但我希望这些视频区域是从OpenCV填充的,作为OpenCV的
cv::nameWindow
方法的替代方法


我如何才能做到这一点?

实现您的愿望的基本工作流程是:

  • 使用OpenCV API打开视频(例如,cvCreateFileCapture)
  • 从视频抓取IplImage帧(cvQueryFrame)
  • 将其转换为QImage(见下面的附加代码)
  • 在QLabel(QLabel::setPixmap和QPixmap::fromImage)中显示QImage on
  • 循环帧更新(使用QTimer,例如,使用视频帧率)
  • 将IplImage转换为QImage的代码(假定为RGB32Bits图像):

    QImage*IplImage到QImage(IplImage*input)
    {
    如果(!输入)
    返回0;
    QImage图像(输入->宽度,输入->高度,QImage::格式_RGB32);
    uchar*pBits=image.bits();
    int nBytesPerLine=image.bytesPerLine();
    对于(int n=0;nheight;n++)
    {
    对于(int m=0;mwidth;m++)
    {
    CVS标量=cvGet2D(输入,n,m);
    QRgb值=QRgb((uchar)s.val[2],(uchar)s.val[1],(uchar)s.val[0]);
    uchar*扫描线=pBits+n*nBytesPerLine;
    ((uint*)扫描线)[m]=数值;
    }
    }
    返回图像;
    }
    
    对上述代码的理解应该是直截了当的。如果有任何疑问,请告诉我们


    此“低级别”选项允许您在显示每个帧之前对其进行操作。如果您只想通过Qt显示视频,可以使用。

    以下是将cv::Mat转换为QImage的代码。方法分别用于24位RGB或灰度浮点

    QImage Mat2QImage(const cv::Mat3b &src) {
            QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
            for (int y = 0; y < src.rows; ++y) {
                    const cv::Vec3b *srcrow = src[y];
                    QRgb *destrow = (QRgb*)dest.scanLine(y);
                    for (int x = 0; x < src.cols; ++x) {
                            destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
                    }
            }
            return dest;
    }
    
    
    QImage Mat2QImage(const cv::Mat_<double> &src)
    {
            double scale = 255.0;
            QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
            for (int y = 0; y < src.rows; ++y) {
                    const double *srcrow = src[y];
                    QRgb *destrow = (QRgb*)dest.scanLine(y);
                    for (int x = 0; x < src.cols; ++x) {
                            unsigned int color = srcrow[x] * scale;
                            destrow[x] = qRgba(color, color, color, 255);
                    }
            }
            return dest;
    }
    
    QImage Mat2QImage(常量cv::Mat3b和src){
    QImage dest(src.cols、src.rows、QImage::Format_ARGB32);
    对于(int y=0;y

    然后,您可以在Qt小部件中使用QImage。查看博尔赫斯的答案。

    我不知道如何在Qt中集成
    opencv
    的窗口,但是如果你在任何阶段都获得
    IplImage
    ,它可以很容易地转换为
    QImage
    QPixMap
    ,可以在
    QLabel
    上显示为Lol4t0,我不知道如何在一些QWidget中集成opencv的视频。但我可以回答如何轻松地手动执行此操作。这真的很简单。@borges那么请回答:)回答得好!但是,他要求C++,你使用OpenCV的C API。另外,我认为如果你想检查图像中的每个像素,cvGet2D并不是很有效!如果您将RGB888用于Qimage,则可以直接使用输入图像。或者使用cvtColor()转换为BGRA以获得更好的qimage性能问题是,它比使用cvShowImage(在其自己的窗口中)慢得多。是否有社区在Qt和OpenCV的集成方面更有效??或者就是这样(我指的是你的代码)?!我也是新来的,我现在的兴趣是这个。谢谢现在,highgui模块可以选择使用Qt支持构建(imshow将为您提供一个漂亮的Qt窗口,带有缩放/平移、保存到文件等按钮)。它起源于谷歌代码夏令营项目。因此OpenCV本身现在在highgui模块中具有集成它们的功能。据我所知,它不是通过API公开的。我不知道他们是否有这样的计划。不过,这很有道理。
    QImage Mat2QImage(const cv::Mat3b &src) {
            QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
            for (int y = 0; y < src.rows; ++y) {
                    const cv::Vec3b *srcrow = src[y];
                    QRgb *destrow = (QRgb*)dest.scanLine(y);
                    for (int x = 0; x < src.cols; ++x) {
                            destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
                    }
            }
            return dest;
    }
    
    
    QImage Mat2QImage(const cv::Mat_<double> &src)
    {
            double scale = 255.0;
            QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
            for (int y = 0; y < src.rows; ++y) {
                    const double *srcrow = src[y];
                    QRgb *destrow = (QRgb*)dest.scanLine(y);
                    for (int x = 0; x < src.cols; ++x) {
                            unsigned int color = srcrow[x] * scale;
                            destrow[x] = qRgba(color, color, color, 255);
                    }
            }
            return dest;
    }