• 12727阅读
  • 6回复

[提问]qml如何加载摄像头视频 [复制链接]

上一主题 下一主题
离线goqqdo
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-01
问题具体如下:(平台linux fedora 版本qt4.8.4)
开始用qml写了界面,其中一块是监控部分,qt c++下完成摄像头的视频的采集,我想将采集的图片在qml界面上显示。采取的方法是将采集到的每幅图片都保存成一个png格式的图片(video1.png)。然后在qml下用个定时器反复读取该图片路径加载。但是界面只显示第一次存储的图片,定时器是起作用的,可能是由于路径不变,图片只读取了一次。看文件夹下的图片是在不断更新的。我想问下将摄像头的视频在qml下显示出来的方法,我想过要么用个循环队列存取多幅图片用qml读取,还没试而且觉得不妥。摄像头部分c++代码是网上下载的能正常运行,是绘制在label中的,我稍微改了下程序不绘制,只存储成文件供qml读取。另外我也不知道如何qml中调用qt中的部件,比如label这种。


混编的方法是将c++类定义一个新的QML元素,头文件就不贴了。
c++部分代码:
ProcessImage::ProcessImage(QWidget *parent):QWidget(parent)
{
....
timer = new QTimer(this);
    //connect(timer,SIGNAL(timeout()),this,SLOT(update()));//update()调用paintEvent函数
   connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrameData()));
    timer->start(30);
....
}
void ProcessImage::ReadFrameData()
{
    rs = vd->get_frame((void **)&p,&len);//获取视频数据
    convert_yuv_to_rgb_buffer(p,pp,640,480/*QWidget::width(),QWidget::height()*/);//转换格式yuv-rgb
    frame->loadFromData((uchar *)pp,/*len*/640 * 480 * 3 * sizeof(char));//得到image
    pixframe=QPixmap::fromImage(*frame,Qt::AutoColor);//将图像转换成pixmap
    pixframe.save("qml/terminal/core/video1.png");//存储图像
...
}
qml部分代码:
Item {
     property string videoPath1:"video1.png"
    width: 780;height: 380
    visible: false

    Videodata{
        id:videodata
    }//

    Timer{
         interval:100; running: true; repeat: true
         onTriggered: {
            test.source=videoPath1(这里)
             console.log("video");
         }
    }

    Rectangle{
        z:0
        anchors.fill: parent
        radius:8
        color:"lightgreen"
        border{width:2;color:"black"}

    Rectangle{
        z:1
        width:500;height:340
        color:"yellow"
        border{width:2;color:"black"}
        anchors{top:parent.top;topMargin:20;left:parent.left;leftMargin:20}
        Image{
            z:2
            anchors.fill:parent
            id:test
        }
}
}
}
初学很多不懂,写的有点乱,见谅。

离线goqqdo

只看该作者 1楼 发表于: 2013-03-01


传个图,就这样,只显示第一帧然后不动了。寻求各种解决方案。
离线yxkaibaoma

只看该作者 2楼 发表于: 2013-03-01
image会自己将读取的图片放到缓存,即使图像更改文件名不改  image也不会读取。
你可以将cache设成false,然后在外部只更改sourceSize即可。
离线yxkaibaoma

只看该作者 3楼 发表于: 2013-03-01
其实你也可以用两张图片交换显示
离线goqqdo

只看该作者 4楼 发表于: 2013-03-02
我先试试看。
离线goqqdo

只看该作者 5楼 发表于: 2013-03-02
将cache设成false,然后在外部只更改sourceSize。是可行的,谢谢。
不过我的这种方式实在是不可取。我看了其他帖子有qmlcamera的示例,可以去参考。


离线xiaohai

只看该作者 6楼 发表于: 2013-03-22
我也正在研究qml显示摄像头,我是重写了QDeclarativeItem子类的repaint()函数,在里面读取摄像头数据,转换成QImage然后drawImage 。通过Timer定时刷新,虽然可以显示视频,但是每隔几秒就会闪烁一下,不知道是怎么回事。
快速回复
限100 字节
 
上一个 下一个