天嵌 ARM开发社区

 找回密码
 注册
查看: 6377|回复: 10

qt OV9650采集图像显示问题

[复制链接]
scg2635an 发表于 2011-12-3 10:34:44 | 显示全部楼层 |阅读模式
本帖最后由 scg2635an 于 2011-12-3 10:36 编辑

在网上找的程序,修改后图像显示严重失真,有谁能帮忙看下吗?很急的
屏是240*320的,代码如下:
void Widget::do_view()
{
        int ret ;
       pp = (unsigned char*)malloc(320*240*2*sizeof(char));

        frame = new QImage(pp,320,240,QImage::Format_RGB16);  
        video_fd = open(VIDEO_DEV_NODE,O_RDWR);
       if(video_fd<0)
            QMessageBox::warning(this,tr("VIDEO_DEV_NODE"),tr("VIDEO_DEV_NODE OPEN ERROR"));
        ret = read(video_fd,pp,320*240*2);
        if(ret<0)
            QMessageBox::warning(this,tr("VIDEO_READ"),tr("VIDEO_READ ERROR"));
        
        if(ioctl(cam_fd,VIDIOCGCAP, &(vd->capability))==-1); //后加的 读video_capability 中信息
            QMessageBox::warning(this,tr("CAM_READ"),tr("CAM_READ ERROR"));
            
        //QPainter *painter =new QPainter(this);
        timer = new QTimer(this);
        connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));
        timer->start(30);
}
void Widget::readFrame()
{
    if(video_fd>0)
    {
       // update();
        read(video_fd,pp,320*240*2);

        frame = new QImage(pp,320,240,QImage::Format_RGB16);  
        frame->loadFromData((unsigned char*)pp,320*240*2*sizeof(char));
        ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));
        free(pp);
        pp = (unsigned char*)malloc(320*240*2*sizeof(char));
    }
}
TQ-lkp 发表于 2011-12-23 09:13:11 | 显示全部楼层

Qt正确显示从摄相头读出的RGB数据如下:
  1. image = QImage((uchar *) preview_buf, m_iWidth,m_iHeight, QImage::Format_RGB16);
  2. QPixmap pixmap;
  3. pixmap = pixmap.fromImage(image);
  4. m_plbImage->setPixmap(pixmap);
  5. m_plbImage->setFixedSize( m_iWidth,m_iHeight);
复制代码




 楼主| scg2635an 发表于 2011-12-26 15:19:11 | 显示全部楼层
谢谢,我试试
前一段时间不知道是怎么回事,怎么也等不上论坛,今天终于登上来了
 楼主| scg2635an 发表于 2011-12-29 10:47:15 | 显示全部楼层
还是不行
这样和我写的那个其实是一种写法吧
TQ-lkp 发表于 2011-12-29 10:53:29 | 显示全部楼层
那只能说是你的图像采集出来的根本不是rgb565格式的
lyol33 发表于 2011-12-29 12:20:59 | 显示全部楼层
connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));
        timer->start(30);

void Widget::readFrame()
{
    if(video_fd>0)
    {
       // update();
        read(video_fd,pp,320*240*2);

        frame = new QImage(pp,320,240,QImage::Format_RGB16);  
        frame->loadFromData((unsigned char*)pp,320*240*2*sizeof(char));
        ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));
        free(pp);
        pp = (unsigned char*)malloc(320*240*2*sizeof(char));
    }
}
一秒1000/30大概为33次吧,神啊,你一秒三十三次的
    free(pp);
    pp = (unsigned char*)malloc(320*240*2*sizeof(char));
就算你能成,这相应速度肯定是不行的,你想想,一秒开三十三次内存,释放三十三次,想想,这你程序思想没理解透彻吗?拿出循环,pp开为全局数组,程序初始化申请一次,当窗口delete销毁的时候free内存,循环只做从camera接口读数据
    然后frame = new QImage(pp,320,240,QImage::Format_RGB16);  
    frame->loadFromData((unsigned char*)pp,320*240*2*sizeof(char));
    ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));实时显示到Lable上面。试试看啊。
    给你一个建议,建议从camera接口读数据,每一次读一帧,读到的数据放到framebuffer里面。让处理器自己实时的DMA到LCD上,TQ测试程序里camera_test有实现你去看看
lyol33 发表于 2011-12-29 12:47:38 | 显示全部楼层
connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));
        timer->start(30);

void Widget::readFrame()
{
    if(video_fd>0)
    {
       // update();
        read(video_fd,pp,320*240*2);

        frame = new QImage(pp,320,240,QImage::Format_RGB16);  
        frame->loadFromData((unsigned char*)pp,320*240*2*sizeof(char));
        ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));
        free(pp);
        pp = (unsigned char*)malloc(320*240*2*sizeof(char));
    }
}
一秒1000/30大概为33次吧,神啊,你一秒三十三次的
    free(pp);
    pp = (unsigned char*)malloc(320*240*2*sizeof(char));
就算你能成,这相应速度肯定是不行的,你想想,一秒开三十三次内存,释放三十三次,想想,这你程序思想没理解透彻吗?拿出循环,pp开为全局数组,程序初始化申请一次,当窗口delete销毁的时候free内存,循环只做从camera接口读数据
    然后frame = new QImage(pp,320,240,QImage::Format_RGB16);  
    frame->loadFromData((unsigned char*)pp,320*240*2*sizeof(char));
    ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));实时显示到Lable上面。试试看啊。
    给你一个建议,建议从camera接口读数据,每一次读一帧,读到的数据放到framebuffer里面。让处理器自己实时的DMA到LCD上,TQ测试程序里camera_test有实现你去看看
 楼主| scg2635an 发表于 2012-1-6 10:39:39 | 显示全部楼层
怎样从camera接口读数据呢,能用mmap函数吗?
谁有camera_test测试程序,我的找不到了
 楼主| scg2635an 发表于 2012-1-6 11:34:28 | 显示全部楼层
ov9650直接read出来的应该是rgb格式的吧?
zhmzwdfx 发表于 2012-4-5 15:09:30 | 显示全部楼层
lyol33 发表于 2011-12-29 12:20
connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));
        timer->start(30);

映射后, 从framebuffer读数据, 然后在lable上显示效率会高一点吗? 为什么 ?
zhmzwdfx 发表于 2012-4-8 10:33:52 | 显示全部楼层
zhmzwdfx 发表于 2012-4-5 15:09
映射后, 从framebuffer读数据, 然后在lable上显示效率会高一点吗? 为什么 ?

相关资料.
Linux摄像头编程  http://blog.csdn.net/ranruoyu1003/article/details/6668298#
Linux摄像头编程,终于成功了 http://hi.baidu.com/deep_pro/blog/item/6786649925ba7d006f068c03.html

framebuffer是直接在LCD上显示的, 而qt是通过不断更新图片显示?? 内存映射该怎么用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-5 01:02 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表