|
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这个图片
}
|
|