opencv 处理视频并使用Qt窗口作为输出

版本: QT 5.6.0 & opencv :3.0.0 windows

曾想到的方法:

  1. 使用QT的视频播放类,QMediaplayer,QVideoWidget 并利用Qt的类提取出每一帧然后用opencv加以处理。尚未找到qt用来提取帧的函数。 代替方法:用QAbstractVideoFilter进行视频处理,但不了解该类非qml的使用方法。(弃用)
  2. 用QPaint 画出video的每一帧,或者直接用label的setPixmp函数。

方法二在实现过程中遇到的问题记录:
1. 对Mat到QImage 格式转换的过程,涉及到qimage mat对图像不同存储方式的转换。

if(img.channels() == 3)
            {
                cv::cvtColor(img,img,CV_BGR2RGB);
                curImage = QImage((unsigned char *)img.data,img.cols,img.rows,img.step,QImage::Format_RGB888);
            }
            else
            {
                curImage = QImage((const unsigned char*)img.data,img.cols,img.rows,img.step,
 QImage::Format_RGB888);
            }

2.capture >> frame 与 painter.drawImage() (或者label->setPixmap(QPixmap::fromImage(image))的同步问题,加一个QTimer类来控制。 其中用scale来调整image大小 嵌入label内。

timer = new QTimer ;
    connect(timer,SIGNAL(timeout()),this,SLOT(changeFrame()));

void MainWindow::changeFrame()
{
    capture >> img;
    cv::putText(img,"putStasar",cv::Point(200,200),5,4,cv::Scalar(255,0,0));
    if(img.channels() == 3)
    {
        cv::cvtColor(img,img,CV_BGR2RGB);
        curImage = QImage((unsigned char *)img.data,img.cols,img.rows,img.step,QImage::Format_RGB888);
    }
    else
    {
        curImage = QImage((const unsigned char*)img.data,img.cols,img.rows,img.step,
                          QImage::Format_RGB888);
    }
    QImage newImage = curImage.scaled(label->width(),label->height());
    label->setPixmap(QPixmap::fromImage(newImage));
}
QtopencvQtopencv库封装,可以方便地在Qt使用opencv库的功能。以下是HoughLinesP函数的使用示例: ```c++ #include <QCoreApplication> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <QImage> #include <QPixmap> #include <QDebug> using namespace cv; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 加载图片 Mat srcImage = imread("test.jpg"); // 转换为灰度图 Mat grayImage; cvtColor(srcImage, grayImage, COLOR_BGR2GRAY); // 边缘检测 Mat edgeImage; Canny(grayImage, edgeImage, 50, 150, 3); // 直线检测 std::vector<Vec4i> lines; HoughLinesP(edgeImage, lines, 1, CV_PI/180, 50, 50, 10); // 绘制直线 Mat lineImage = srcImage.clone(); for (size_t i = 0; i < lines.size(); i++) { line(lineImage, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(0, 0, 255), 3, LINE_AA); } // 显示结果 QImage qimg((const unsigned char *)lineImage.data, lineImage.cols, lineImage.rows, lineImage.step, QImage::Format_RGB888); QPixmap pixmap = QPixmap::fromImage(qimg.rgbSwapped()); QLabel label; label.setPixmap(pixmap); label.show(); return a.exec(); } ``` 在这个示例中,我们首先使用imread函数加载一张图片,然后将其转换为灰度图和边缘图。接着,我们使用HoughLinesP函数检测图像中的直线,并使用line函数将这些直线绘制到一张新的图像上。最后,我们将这张图像显示到Qt窗口中。 HoughLinesP函数的参数解释如下: - edgeImage:边缘图像,必须是单通道、8位、二值化的图像。 - lines:输出直线的向量。 - rho:极径步长,默认值为1。 - theta:极角步长,默认值为CV_PI/180。 - threshold:直线阈值,表示在一条直线上需要多少个交点才认为这条直线是有效的。默认值为80。 - minLineLength:直线的最小长度,默认值为0。 - maxLineGap:直线的最大间隔,默认值为0。 注意:以上代码仅供参考,实际使用中可能需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值