TQ2440 基于V4L2编程框架的 LCD实时显示(下)

Linux设备驱动之LCD显示摄像图像之二编写V4l2程序 LCD显示摄像图像之二编写V4l2程序 阅读详情

绪上一篇:

本次实验为基于V4L2框架,使用USB摄像头进行图像采集,用4.3寸LCD屏进行实时显示。由于,知识缺乏未能完整的进行下去,失败在图像实时显示上面,因为要放一段时间,所以在此做次记录,希望能帮助到一些小伙伴,站在前人的路上把该问题解决掉。

一、情况说明

1、使用TQ2440开发板、4.3寸TFT LCD屏,分辨率为480*272  16bpp

2、普通USB摄像头,采集的图像格式为YUV422,分辨率为320*240

二、实验进展

1、USB摄像头可以进行图片采集,但在lcd显示时不能全屏显示,只显示lcd屏上面一半,且出现三个窗口暂时不知怎么解决

2、摄像头采集的图片为YUV422格式要在LCD屏显示需要转成RGB565格式,这个已经完成

3、由于二十多块买的摄像头其分辨率320*240,需要将其放大到480*272,这个代码已经完成

三、所遇问题

现在不知如何解决图像正确显示问题。。。。

   

/*****************************************以上是上一次遇到的并停下的问题***************************************************************/

最新情况:

又经过了一个多星期,应该说放了一个多星期,就在前天突然在韦东山老师的第三个项目中找到的可以相关代码,然后参考其实现代码,我在原来的基础上改了图片显示的方式。

之前由于摄像头采集到的图像像素为320*240,而lcd显示屏像素为480*272,因此采集到的图像像素和显示屏像素是不相等的。当时,我的想法是直接在lcd上从fb0的映射地址起始处写入数据,然后就出现了之前出现的三个一个屏三个窗口的结果。无奈之下,我就想就参考下韦东山老师项目中的居中显示吧,没想到一试竟然马上成功了。如下图所示。

 

然后仔细看代码,以及修改了一些代码进行测试,终于找出了以前困扰我许久的显示问题:为什么会出现三个或多个窗口?

原来我之前是吧一张像素为320*240的图像,将其数据从其buf[0]->buf[Max_size]一股脑的直接写入fb映射的显存中去,而没有分行分行的去显示所采集图像的内容,这就导致原本下一行的像素数据直接填充到了这一行,这样自然会出现这些错位,多窗口的现象。

   以前的代码:

memcpy(fb_addr,buf[index].start,buf[index].length)    //这是错误的,将导致一开始的多窗口效果

   修改之后:

for (i = 0; i <camdev->cHeight; i++)   //camdev->cHeight为采集到的图像高度
{
//这里每次只拷贝一行的像素数据
memcpy(pucDst, pucSrc, camdev->cLineBytes);
pucSrc += camdev->cLineBytes;//到下一行取数据
pucDst += myfb->iLineBytes;//到下一行显示
}

修改代码后便可正常显示。下面这张截图是320*240像素放大到480*272像素的图像显示效果,图像放大,采用了最近邻插值法,这是最简单,但效果最不好的一种方法,所以图片会有点模糊,但已经可以完成由摄像头采集图像信息,并在lcd实时显示了。

以下是部分核心代码:


/*
*函数功能:图像处理并显示
*/
void display_pic(Cam_dev *camdev,Fb_dev *myfb)
{
    struct v4l2_buffer buf;   
    unsigned char* ptmp;
    unsigned long i,j;
    
    CLEAR (buf);   
    buf.memory = V4L2_MEMORY_MMAP;   
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;   
    /*取出一缓冲帧*/
    if (-1 == ioctl(camdev->cfd, VIDIOC_DQBUF, &buf)) 
    {   
printf(" VIDIOC_DQBUF error!\n");
exit(-1);
    }   
    /*检查缓冲帧是否有效*/
    assert(buf.index < 4);  
     
    /*图片格式转换:YUV422->RGB565*/
    ptmp = (unsigned char*)buffers[buf.index].start;
    Pyuv422torgb565(ptmp,camdev->displaybuf,camdev->cHeight,camdev->cWidth);
    
    /*图像放大后LCD显示*/
    PicZoomF(camdev,myfb);
    /*小图像居中显示*/
    //PicMerge(camdev,myfb);
    
    if (-1 == ioctl(camdev->cfd, VIDIOC_QBUF, &buf))   
    {
    printf("VIDIOC_QBUF error!\n");
exit(-1); 
    }
}

/*
*函数功能:居中显示小的图像
*/
int PicMerge(Cam_dev *camdev,Fb_dev *myfb)
{
int i;
int iX,iY;
unsigned char *pucSrc;
unsigned char *pucDst;

iX = (myfb->iWidth -camdev->cWidth )/2;
iY = (myfb->iHeight -camdev->cHeight )/2;



       //指向yuv422->RGB565转换后的图像起始位置
pucSrc = camdev->displaybuf;
//计算空出来的起始的空格
pucDst = myfb->fb_addr + iY * myfb->iLineBytes + iX *myfb->iBpp/8;

for (i = 0; i <camdev->cHeight; i++)
{
//这里每次只拷贝一行的像素数据
memcpy(pucDst, pucSrc, camdev->cLineBytes);
pucSrc += camdev->cLineBytes;//到下一行取数据
pucDst += myfb->iLineBytes;//到下一行显示
}
return 0;
}
/*
*函数功能:进行图像缩放并显示
*/
int PicZoomF(Cam_dev *camdev,Fb_dev *myfb)
{
    unsigned long dwDstWidth = myfb->iWidth; //LCD一行像素宽度
    unsigned long* pdwSrcXTable;
    unsigned long x;
    unsigned long y;
    unsigned long dwSrcY;
    unsigned char *pucDest;
    unsigned char *pucSrc;
    unsigned long dwPixelBytes =myfb->iBpp/2;  //每个像素字节数


    //创建了放一行像素的空间
    pdwSrcXTable = malloc(sizeof(unsigned long) * dwDstWidth);

    if (NULL == pdwSrcXTable)
    {
        printf("malloc error!\n");
        return -1;
    }


    //生成表 pdwSrcXTable
    for (x = 0; x < dwDstWidth; x++)
    {
        pdwSrcXTable[x]=(x*camdev->cWidth/myfb->iWidth);
    }
    //进行列的缩放
    for (y = 0; y < myfb->iHeight; y++)
    { 
        dwSrcY = (y * camdev->cHeight / myfb->iHeight);
             //目标图像的第x行起始地址
pucDest = myfb->fb_addr + y*myfb->iLineBytes;
//原始图像的第x行起始地址
pucSrc  = camdev->displaybuf + dwSrcY*camdev->cLineBytes;

        for (x = 0; x <dwDstWidth; x++)
        {
            /* 原图座标: pdwSrcXTable[x],srcy
             * 缩放座标: x, y
*/
memcpy(pucDest+x*dwPixelBytes, pucSrc+pdwSrcXTable[x]*dwPixelBytes, dwPixelBytes);
        }
    }


    free(pdwSrcXTable);
return 0;
}

 

工程源码下载:http://download.youkuaiyun.com/download/chasing_chasing/9947863

 

基于OpenCV 、VS2008 MFC对话框的USB摄像头的控制和视频播放、跟踪(logitech sphere AF网络摄像头) 基于OpenCV 、VS2008 MFC对话框的USB摄像头的控制和视频播放、跟踪(logitech sphere AF网络摄像头) 1.opencv2.vs2008 mfc3.logitech sphere AF网络摄像头的pan tilt zoom控制4.SIR粒子滤波 我已经做完了,总结完后上传。    草稿 PTZ (Pan, T 阅读详情

相关推荐

V4L2_USB摄像头_LCD实时显示代码

该文件是基于v4l2接口编程的从USB摄像头采集图像信息,并在LCD实时显示的代码,里面是纯c写的,由Makefile编译

8、V4L2接口学习、显示摄像头画面、集成项目使用

基本思想:因为手中有个AHD的摄像头,实时获取视频帧,所以简单的根据bilibili大佬学习一下v4l2编程。。 第一步:先拷贝一张图,整个v4l2的取帧流程 具体讲解参考这个大佬的bilibili和有道笔记https://note.youdao.com/ynoteshare/index.html?id=7c4c0e28888d03ec70d339118c374edb&type=note&_time=1652171642765 第一版代码,完成摄像头的帧获取和写入本地显示 参..

sxj731533730 2604

TQ2440 Lcd程序 ADS工程 显示图片

TQ2440开发板的LCD程序 ADS中建立的工程,可以显示一图片 分辨率为 320 *240

TQ2440裸板---lcd液晶显示(详细注释)

lcd.h#include "uart.h" #include #include #include "def.h" #include "option.h" #include "2440addr.h" #include "2440lib.h" #include "2440slib.h" #define MVAL (13) #define MVAL_USED (0) //MM

mimixi666的专栏 1420

在2440上面显示一张BMP图片

这是在2440的LCD上面显示一张图片,在TQ2440上面测试过能成功运行并在LCD上显示图片,只能解码BMP图片的格式,,并在LCD的framebuffer里显示,代码里面有详细的注释,运行时请在后面加上你要显示的BMP文件名,这个程序可以帮你了解BMP图片的解码,和LCD的framebuffer显存的使用,

TQ2440显示屏LCD红蓝绿三色显示裸机程序

TQ2440裸机开发LCD程序,包含启动代码的各文档说明。通过向串口发送数据,按键n可循环显示绿,蓝,红,按ESE可退出程序。可以下载到SDRAM中查看程序运行效果。

【转】TQ2440的学习——TFT LCD控制显示总结(硬件概念、初始化相关配置)

<br />TQ2440的学习——TFT LCD控制显示总结(硬件概念、初始化相关配置)<br />源地址:http://nervfzb.blog.163.com/blog/static/314813992011215105432369/<br /> <br />嵌入式开发 20

jaylondon的技术博客 6850

软件工程导论考试通关秘籍:太原理工大学历年真题解析(附答案)

本文为太原理工大学《软件工程导论》考试提供高效备考指南,通过解析近六年真题,揭示高频考点如软件生命周期、UML建模和结构化设计等核心模块的命题规律。文章提供真题拆解、实战策略和避坑指南,帮助考生掌握图形转换题和简答题的应答技巧,助力考试通关。

weixin_29233333的博客 227

TQ2440 基于V4L2编程框架的 LCD实时显示(上)

前言 本次实验为基于V4L2框架,使用USB摄像头进行图像采集,用4.3寸LCD屏进行实时显示。由于,知识缺乏未能完整的进行下去,失败在图像实时显示上面,因为要放一段时间,所以在此做次记录,希望能帮助到一些小伙伴,站在前人的路上把该问题解决掉。 一、情况说明 1、使用TQ2440开发板、4.3寸TFT LCD屏,分辨率为480*272 16bpp 2、普通USB摄像头,采集的图像格式为Y...

Chasing_Chasing的博客 1216

嵌入式学习之QT学习---14 QT跨平台运行之把QT程序交叉编译到ARM开发板

想要把qt工程放到开发板上运行,就需要用到交叉编译。由于qt是跨平台的,所以只需要换个编译器编译一下就可以。 以“定时器”的例子为例,在移植之前还需要进行一个准备工作,在windows下运行的时候,电脑屏幕很大,但是运行的窗口只有一点点大,开发板也有外接屏幕,如何让运行窗口自动适配开发板的外接屏幕呢?令其占满屏幕显示,而不是一小块。 第一步:需要设置一下,先给ui布局,如果不布局,控件就不会随着屏幕的大小的变化而变化。 第二步:利用代码来获取屏幕的大小,给widget.cpp文件下添加如下代码 #inclu

qq_42822743的博客 5457

【AI知识点】启发式算法(Heuristic Algorithms)

启发式算法(Heuristic Algorithms) 是一种基于经验、直觉和局部优化的求解问题的算法,尤其适用于解决计算复杂度高、规模庞大的问题。它们通过简化问题、局部搜索和快速近似,提供了一种在短时间内获得“足够好”解的途径。虽然启发式算法无法保证全局最优解,但它们在实际应用中广泛使用,特别是在优化问题、任务调度和机器学习等领域。

AI完全体 3031

关于Linux的视频编程(v4l2编程)

最近在看TQ2440从摄像头采集图像,然后直接在LCD显示的程序,看到文章有用转过来吧。其实V4L2标准说的很清楚,只是太多了,只好找别人的经验直接拿过来看看,重要的参考文件就是V4L2页面的参考程序capture.c 地址http://v4l2spec.bytesex.org/ 我的摄像头在Linux下面用lsusb显示信息如下  root@ubuntu:/opt/myproject/ca

sxjk1987的专栏 9918

Go-zero微服务实战:从零搭建电商用户系统(含完整代码示例)

本文详细介绍了如何使用go-zero框架从零搭建电商用户系统,包含完整的微服务架构设计、核心功能实现代码示例以及性能优化策略。通过分层架构设计、JWT认证、分布式锁等关键技术,实现高并发、高可用的用户系统,适用于电商平台开发。

weixin_29275257的博客 256

TQ2440实验板OV9650测试程序的详解

我买的是TQ2440实验板,LCD是480*272。实验板给的测试程序是针对320x240的,下面给出详细注解,并且改成480*272显示。修改后的程序在板子上成功运行。 程序中的注解只是我作为一个初学者的角度来理解的,有什么不对的地方还望指教。 /* * TQ2440 camera test program * * preview : 480*272 overlay on 48

iRobot的专栏 5187

抖音最新风控体系研究

小编从技术角度对抖音的风控史和落地目标,跟大家聊一聊抖音,包括海外版抖音TikTok的现状与生态。 1、非常非常早的时期,抖音刚出来的时候,没有任何封禁,这个阶段,导入一个开发库,加上一个请求头,咵咵咵的数据随便拿。 2、2018-2019年,抖音加入了设备id和xg机制,在绝大多数的接口中,携带了设备id参数,同时在请求头中加入了xg,如今的apk市场,能追溯到的最早xg是0200打头的,而小编见过的最早的xg是0000打头的。这个时期的接口,这些参数都还只是预设,没有实际的用处,设备随便写,

qq517348412的博客 1万+

9.Vue前端使用iframe集成帆软报表的单点登录

CPT普通报表的地址:【帆软的服务http】+【/webroot/decision/view/report?【帆软的服务http】+【/webroot/decision/view/form?// fineReportHttp:帆软部署的地址。//如果为ie浏览器则页面加载完成后立即执行。// fineLinkSrc:帆软报表的url。//其他浏览器则重新加载onload事件。// 拿到配置的帆软报表的地址参数。//判断是否为ie浏览器。// 帆软报表登录和打开。// 帆软报表登录和打开。

qq_27860623的博客 4649

TQ2440移植Android的问题2

截止目前为止,我的android内核可以在tq2440板子上跑起来了。 从以前的没有修改机器码,到识别了没有输出信息(串口驱动),还有,nand flash驱动,网卡驱动,内核时钟的配置,整个内核是启动了。 但是,lcd驱动却很不给力,虽然nfs挂载起来了,但是在释放内存后,

钱国正的专栏 1327

置顶必读(1) |《YOLOv11实战:从入门到深度优化》专栏导读,带你一文了解本专栏!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 12万+

tq2440 4.3寸LCD实现终端+键盘操作

先上效果图 LCD驱动和显示先不说了,文章很多。只是Consle 的实现 Linux内核2.6.30.4 make menuconfig 选中Framebuffer Console Rotation DEVICE DRIVER-------> Graphics support-------> ...

马哥滴码 375

Openclaw 附录B 常用Skills清单

核心作用支持URL、网页、PDF、图片、音频和YouTube视频的摘要与字幕提取,由OpenClaw创始人@steipete开发的官方内置Skill。安装⚠️说明:原推荐的summarize未在ClawHub验证到,YouTube字幕提取功能已内置于summarize中。使用场景“提取这个2小时Next.js教程视频的核心代码逻辑,按章节整理成学习笔记”推荐指数:⭐⭐⭐⭐。

Maynor的博客 857

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Linux环境下使用V4L2+opencv以MJPEG格式读取USB摄像头并实时显示

转眼间,V4L2已经搞了很长时间,从最开始的一窍不通,到后来的渐渐熟悉,从最开始照猫画虎的使用YUYV格式之间转换,到后来使用MJPEG格式读取,中间颇有周折。趁任务完成间隙,来简单总结下V4L2的使用。(文章只主要写了过程,完整程序已经附在最后)有读者要问,opencv已经有相关的读取摄像头的函数,为什么要使用V4L2这么麻烦呢。其实主要是因为后面要将程序移植到板子上,而在板子上不能直接使用op...

csdnall的博客 1817

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于TQ2440的电子相册项目实现

1.实现功能: 用LCD来显示图片结合按键来实现上一幅下一幅图片显示,加上自动播放图片功能 2.开发时间:2012年8月 3.所需环境: Linux虚拟机,交叉编译链4.3.3,ARM开发板 4.项目描述: (1)通过TQ2440开发板实现一个电子相册,用2440的按键实现各种操作并实现相应的中断定时 (2)主要用到Linux下多进程异步运行,进程间通信和

yan_0910的博客 1927

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android surface flinger

SurfaceFlinger在系统启动阶段作为系统服务被加载。应用程序中的每个窗口,对应本地代码中的Surface,而Surface又对应于SurfaceFlinger中的各个Layer,SurfaceFlinger的主要作用是为这些Layer申请内存,根据应用程序的请求管理这些

brucexu1978的专栏 1594

用v4l2和framebuffer实现usb摄像头视频采集并显示

用v4l2和framebuffer实现usb摄像头图像采集并显示   前言 很多天了,看了数不尽的论坛和各网站的帖子后,我把我遇到的问题都解决的差不多了,感觉应该是把摄像头跑起来了,但还是遇到了一些问题,似乎是图像处理方面的,我好像解决不了这个问题了,我好想有个人帮帮我。写这篇文章估计得花3~4小时,我真心希望哪位朋友能明白我的想法,能顺手帮帮我。   正文 一,我的思路 我想用一幅

2万+

LCD驱动移植之背光控制

移植环境 BootLoader:u-boot-1.1.6 kernel:linux-2.6.30.4 CPU:s3c2440 开发板:TQ2440 移植步骤 控制 LCD 背光的开关对于TQ2440 开发板来讲,就是控制S3C2440 的 LCD 控制的LCD_PWREN 脚,根据 S3C2440 的datasheet,可以知道在 LCDCON5 寄存器的 PWREN 位是控制 LCD 是否输出的...

阿乐的博客 680

从整体上看Android图像显示系统

Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。假如没有图形显示系统,手机可能就是个对讲机。Android图形显示系统比较复杂,这里我们从整体上理一遍,细节留待后期再去深入。 开局一张图: 上图是Android图形显示系统的一个全貌图。 每个Layer对应着一个Surface。Surface 由每个需要显示的进程View树创建(View树本身对应一个Surface,是为主线程UI的Surface,遇到SurfaceView时挖洞,产生额外的Surfa.

Jason_Lee155的博客 5471
上一篇: QT 实现在ui控件QLabel中实现滚动字幕
下一篇: QT5.6移植到ARM 之 移植tslib1.4总结
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值