5247|6

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440里面基于ZC301的摄像头的QT4.5上显示视频的问题 [复制链接]

要做个基于S3C2440的视频跟踪的东西,但目前遇到的问题太多了,现在是摄像头的视频提取与显示的方法未必对,下面是一部分主要的程序,肯定有许多地方是不合适地,希望大家能指教一下,目前下面的程序的问题是图片刷新很慢,并且只能刷新一段时间,测试发现是在定时服务程序里面的打开文件的影响,也许这样是不合适,现在总感觉自己的思想进了一个死胡同,也许实现方式的大方向上出现了偏差!请大家指教!谢谢!!
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include "mainwindow.h"
#include "led.h"
#include "v4l.h"
#define norm VIDEO_MODE_NTSC
#define DEFAULT_FILE_NAME "picture"
//////
char *buffer=NULL;
//char *buffer;
    v4ldevice VD;
    v4ldevice *vd=&VD;
// v4ldevice *vd;
    int frame;
    int f_d;
//////////////
char open_flag=1;
double count;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    f_d=0;

    QPushButton *button = new QPushButton(this);
       QTimer *timer = new QTimer (this);

       /*  char *buffer=NULL;
             v4ldevice VD;
             v4ldevice *vd=&VD;

             int frame=0;
             int f_d;*/
           ////  while(1)

             f_d=open(DEFAULT_FILE_NAME,O_RDWR|O_CREAT,0666);//获取文件的描述符

             if(0==v4l_open("/dev/video0",vd)) //打开设备
                 printf("open success!\n");
             else
                 printf("open failure\n");
         //    set (vd);
             if(0==v4l_set_norm(vd,norm))
                 printf("set_norm success\n");
             else
                 printf("set_norm failure\n");
         if(0==v4l_grab_init(vd,NTSC_WIDTH,NTSC_HEIGHT))//初始化设备,定义获取图像的大小
                 printf("init success!\n");
             else
                 printf("init failure\n");
             if(0==v4l_mmap_init(vd))//内存映射
                printf("memory map success!\n");
                else
                printf("memory map failure\n");

       connect (button,SIGNAL(clicked()),this,SLOT(timerUpDate()));
       connect (timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
       timer->start(66);

        led = new Led(this);
        led->setGeometry(0,0,320,240);
        led->setValue(0);



}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::timerUpDate()
{
    char i;
    count++;
    i=count%2;
    printf("there is timerout!\n");
        f_d=open(DEFAULT_FILE_NAME,O_RDWR|O_CREAT,0666);//获取文件的描述符


        if(0==v4l_grab_start(vd,frame))//开始获取图像
            printf("get picture success!\n");
        else
            printf("get picture failure\n");

       v4l_grab_sync(vd,frame);//等待传完一帧

            buffer=(char *)v4l_get_address(vd);//得到这一帧的地址
            printf("img address %p\n",buffer);

  write(f_d,buffer,NTSC_WIDTH*3*NTSC_HEIGHT);//在根文件下保存了一个名为picture的图片 ,格式为MJPEG的,总是感觉这种方法不太对,图片的显示频率也很慢,不知道是不是有其他方法呢?
      
            led->setValue(0);通过这个值的设定告诉另一个类去加载picture这个图片
         }

最新回复

为什么我的程序执行到v4l_grab_sync(vd,frame)处就卡着不动了,请高手指导  详情 回复 发表于 2011-6-20 12:57
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1. 在timerUpDate()中,将获取的视频写到硬盘文件f_d中,写的动作可能会花很多CPU时间;由于该写动作和v4l_grab_sync()在一起,会造成取视频数据太慢。如果摄像头工作在30fps,那么取视频的频率也要保证30fps,不然,可能会造成设备USB数据传输溢出;
2. 文件只有一个,一个线程去写(获取视频数据),另外一个线程去读(显示视频数据),两者是不能同时进行的,很容易造成阻塞;
3. led->setValue(0);这种设置标志为的线程间通讯效率太低;

所以,LZ还是应该多参考别的视频捕捉和显示程序,改进程序设计。
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮你顶
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢,现在换了一种的显示,但是用QIMAGE来显示YUYV的格式的时候是没问题的,但是想把YUYV转换成RGB24再显示出来就不成功了,还请高手指教!
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

5
 
1. QIMAGE是什么?
2. 能够显示YUYV了,为什么要把YUYV转换成RGB24再显示出来?什么意思?
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

6
 
我的程序执行到v4l_grab_sync()这一步就卡着不动了,请各位大侠指导小弟是什么原因啊
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

7
 

v4l采集程序同步出现问题

为什么我的程序执行到v4l_grab_sync(vd,frame)处就卡着不动了,请高手指导
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表