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

V4L2通过摄像头采集图片 (转载) #include    #include    #include        #include    #include               #include                #include    #include    #include    #include    #include    #include    #include    #inc 阅读详情

前言

本次实验为基于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,这个代码已经完成

三、所遇问题

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

下面是显示代码:

#include "v4l2_device.h"

static int width=320;
static int height=240;
struct buffer *buffers=NULL;
unsigned char* newBuf;
char *dev_name="/dev/video0";
short oldpic[240][320];
short delpic[272][480];

struct v4l2_src
{
    int cam_fd;
}app;


/********************************
*函数功能:打开摄像头
*********************************/
int open_cam_dev(void)
{
    if((app.cam_fd=open(dev_name,O_RDWR|O_NONBLOCK,0))<0)
    {
        printf("device:%s open failed!!\n",dev_name);
        exit(-1);
    }
    return 0;
}


/********************************
*函数功能:初始化摄像头+显示摄像头信息
*********************************/
void init_device(void)
{
    struct v4l2_capability cap;
    struct v4l2_fmtdesc fmtdesc;
    struct v4l2_format fmt;
    unsigned int min=0;
    
    //1、查询摄像头信息并打印
    if (ioctl(app.cam_fd, VIDIOC_QUERYCAP, &cap) == -1) 
    {
        printf("Error opening device %s: unable to query device.\n",dev_name);
        exit(-1);
    }
    else
    {
    /*打印信息*/
    printf("*************Camera-params***************\n");
    printf("driver:\t\t%s\n",cap.driver);
        printf("card:\t\t%s\n",cap.card);
        printf("bus_info:\t%s\n",cap.bus_info);
        printf("version:\t%d\n",cap.version);
        printf("capabilities:\t%x\n",cap.capabilities);
        printf("*****************end*********************\n");
         
        /*检测摄像头是否支持图像抓取功能*/
        if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == V4L2_CAP_VIDEO_CAPTURE) 
        {
            printf("Device %s: supports capture.\n",dev_name);
        }
/*检测摄像头是否支持视频流*/
        if ((cap.capabilities & V4L2_CAP_STREAMING) == V4L2_CAP_STREAMING) 
        {
            printf("Device %s: supports streaming.\n",dev_name);
        }
    }


   
    //2、显示所有支持格式
    fmtdesc.index = 0;
    fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    printf("Support format:\n");
    while(ioctl(app.cam_fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1)
    {
        printf("\t%d.%s\n",fmtdesc.index+1,fmtdesc.description);
        fmtdesc.index++;
    }
    
    //3、设置摄像头格式
    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    fmt.fmt.pix.height = height;
    fmt.fmt.pix.width = width;
    fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
    
    if (-1 == ioctl(app.cam_fd, VIDIOC_S_FMT, &fmt))  
    { 
    printf("VIDIOC_S_FMT error!\n");
        exit(-1);   
    }
        
    if(ioctl(app.cam_fd, VIDIOC_G_FMT, &fmt) == -1)
    {
        printf("Unable to get format\n");
        exit(-1); 
    } 
    {
         printf("fmt.type:\t\t%d\n",fmt.type);
         printf("pix.pixelformat:\t%c%c%c%c\n",fmt.fmt.pix.pixelformat & 0xFF,     (fmt.fmt.pix.pixelformat >> 8) & 0xFF,(fmt.fmt.pix.pixelformat >> 16) & 0xFF, (fmt.fmt.pix.pixelformat >> 24) & 0xFF);
         printf("pix.height:\t\t%d\n",fmt.fmt.pix.height);
         printf("pix.width:\t\t%d\n",fmt.fmt.pix.width);
         printf("pix.field:\t\t%d\n",fmt.fmt.pix.field);
    }
    /* Note VIDIOC_S_FMT may change width and height. */   

    /* Buggy driver paranoia. 
    min = fmt.fmt.pix.width * 2;   
    if (fmt.fmt.pix.bytesperline < min)   
fmt.fmt.pix.bytesperline = min;   
    min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;   
    if (fmt.fmt.pix.sizeimage < min)   
fmt.fmt.pix.sizeimage = min; 
*/ 
   
}

/********************************
*函数功能:映射摄像头帧缓冲
*********************************/
void init_mmap(void)
{
    unsigned int n_buffers;
    struct v4l2_requestbuffers req;
    
    //1、请求四个缓冲帧
    req.count = 4;
    req.memory = V4L2_MEMORY_MMAP;
    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    
    if(ioctl(app.cam_fd,VIDIOC_REQBUFS,&req)==-1)
    {
        printf("request for buffers error!\n");
    }
    if (req.count < 2)
    {
    printf("Insufficient buffer memory on %s\n",dev_name); 
        exit(-1);
    }
    
    //2、分配图像缓冲结构 (mmap for buffers) 
    buffers = calloc(req.count, sizeof (*buffers));  
    if (!buffers) 
    {
        printf ("Out of memory: error!\n");
        exit(-1);
    }
    
    //3、把内核空间中的图像缓冲区映射到用户空间 
    for (n_buffers = 0; n_buffers < req.count; ++n_buffers) 
    {   
    struct v4l2_buffer buf;   

CLEAR(buf);   

buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;   
buf.memory      = V4L2_MEMORY_MMAP;   
buf.index       = n_buffers;   
/*获取要映射屏幕大小*/
if (-1 == ioctl(app.cam_fd, VIDIOC_QUERYBUF, &buf))   
{
printf ("VIDIOC_QUERYBUF error!\n");
exit(-1);   
} 

/*这里的输出是为了检查有关lcd参数的大小*/
buffers[n_buffers].length = buf.length;   
printf("buf.length=%d\nbuf.m.offset=%d\n",buf.length,buf.m.offset);

buffers[n_buffers].start =   
mmap(NULL /* start anywhere */,   
buf.length,   
PROT_READ | PROT_WRITE /* required */,   
MAP_SHARED /* recommended */,   
app.cam_fd, buf.m.offset);   
/*不成功则退出*/
if (MAP_FAILED == buffers[n_buffers].start)   
{
printf ("mmap error!\n");
exit(-1);   
}  
    }   
}


/********************************
*函数功能:启动捕获图像
*********************************/
void start_capture(void)
{
    unsigned int i;
    enum v4l2_buf_type type;//帧类型,应用程序设置  
    
    /*将缓冲帧放入队列*/
    for (i = 0; i < 4; ++i)
    {   
struct v4l2_buffer buf;   
CLEAR(buf);   

buf.index       = i;   
buf.memory      = V4L2_MEMORY_MMAP;   
buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;  

if (-1 == ioctl(app.cam_fd, VIDIOC_QBUF, &buf))   
{
printf ("VIDIOC_QBUF error!\n");
exit(-1);   
}  
    }   

    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;   
    /*启动数据流*/
    if (-1 == ioctl(app.cam_fd, VIDIOC_STREAMON, &type))  
    {
printf ("VIDIOC_STREAMON error!\n");
exit(-1);   
    }    
    printf ("Start to capture!\n");
}


/********************************
*函数功能:主循环播放视频流
*********************************/
void mainloop(short *fb_addr)
{
    int ret;
    fd_set fds;
    struct timeval tv; 
    
    while (1)
    {   
    /*每次循环都要清空*/
FD_ZERO(&fds);   
/*添加描述符*/
FD_SET(app.cam_fd, &fds);   

/* Timeout. */   
tv.tv_sec  = 2;   
tv.tv_usec = 0;   
ret = select (app.cam_fd + 2, &fds, NULL, NULL, NULL);   
 
/*select错误,退出*/
if (-1 == ret) 
{   
printf("Select() error!\n");
//exit(-1);   
break;
}   
if (0 == ret) {   
printf("select timeout\n");   
continue;   
}   
if(FD_ISSET(app.cam_fd, &fds))
{
display_pic(fb_addr);
}
    }
}


void display_pic(short *fb_addr)
{
    struct v4l2_buffer buf;   
    unsigned char* ptr;
    unsigned long i,j;
    
    CLEAR (buf);   
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;   
    buf.memory = V4L2_MEMORY_MMAP;   


    /*取出一缓冲帧*/
    if (-1 == ioctl(app.cam_fd, VIDIOC_DQBUF, &buf)) 
    {   
printf(" VIDIOC_DQBUF error!\n");
exit(-1);
    }   
    /*检查缓冲帧是否有效*/
    assert(buf.index < 4);   
    
    ptr = (unsigned char*)buffers[buf.index].start;
    /*图片格式转换*/
    yuv422_2_rgb(ptr);
    
    //memcpy(fb_addr,oldpic,buffers[buf.index].length);
    /*图片放大*/
    fangsuo(fb_addr);
    /*将摄像头获取的图像写入LCD缓冲帧进行显示
    *但在这里因为失败了,原因暂时未知
    *时间:2017.08.10
    */
    for(i=0;i<272;i++)
  for(j=0;j<480;j++)
  {
    *(fb_addr+i*480+j) = delpic[i][j];
      }
 
    //printf("the camera_buf size:%d\n",buffers[buf.index].length);
    
    /*缓冲帧入队列*/
    if (-1 == ioctl(app.cam_fd, VIDIOC_QBUF, &buf))   
    {
    printf("VIDIOC_QBUF error!\n");
exit(-1); 
    }
}
/************************************************
*对320*240图片采用最近邻插值法放大到480*272分辨率
***********************************************/
void fangsuo(short *fb_addr)
{
unsigned int i,j;
unsigned int srcx=0,srcy=0;
float tmpX,tmpY;

tmpY = 240/272;
tmpX = 320/480;

for(i=0;i<272;i++)
  for(j=0;j<480;j++)
  {
  srcx = (int)(j*tmpX +0.5);
  srcy = (int)(i*tmpY +0.5);
 
  delpic[i][j] = oldpic[srcy][srcx];
  //delpic[i][j] = i+j;
  } 
}


/*********************************************
*摄像头采集的为:YUV422(16bpp)转换为RGB565(16bpp)
*********************************************/
void yuv422_2_rgb(unsigned char* inbuf)
{
       unsigned char *YUVdata;
       short *RGBdata;
       unsigned long i,size=width*height;
       unsigned char y,u,v;
       unsigned int r,g,b;
       unsigned short rgb;
       
       YUVdata= inbuf; 
       RGBdata = (short*)oldpic;
       
       for(i=0;i<size;i++)
       {
        
             y=*(YUVdata+i*2);
             u=(*(YUVdata+i*2+1)>>4)&0x0f;
             v=(*(YUVdata+i*2+1)>>4)&0xf0;
   
             //r= y+1.4075*v;
             //g= y-0.3455*u-0.7169*v;
             //b= y+1.779*u; 
             r=y+ v+ (v*103>>8);
             g=y- (u*88>>8) - (v*183>>8);
             b=y+ u + (u*198>>8);
          
             r=r>255?255:(r<0?0:r);
             g=g>255?255:(g<0?0:g);
             b=b>255?255:(b<0?0:b);    
             //rgb888转rgb565
    r >>= 3; //RGB565格式中red占5位,green占6位,blue占5位,故需进行移位
    g >>= 2;
    b >>= 3;
    
    rgb = (r<<11)|(g<<5)|(b);//生成一个2个字节长度的像素点,即rgb565
      //赋给lcd映射的buffer
             *RGBdata++ = (short)rgb;   
       }
}

void uninit_device(int lcd_fd)
{
    unsigned int i;
    for (i = 0; i < 4; ++i)
      munmap (buffers[i].start, buffers[i].length);   
    
    free(buffers);  
    
    close(app.cam_fd);
    close(lcd_fd);
    printf("quit!!\n");
}

 

 

v4l2摄像头数据获取并显示到fb上,yuv格式处理 使用v4l2采集摄像头数据,将yuv图像解码成rgb,并显示到fb上主要流程v4l2驱动采集摄像头数据 折腾了一个多星期,总算实现了摄像头数据采集并显示到屏幕上,整理一下嵌入式Linux从摄像头获取数据并显示到fb屏幕上的过程。使用尽量少的依赖,只用了v4l2视频设备驱动以及fb驱动,更加深入的理解了计算机底层图像处理的原理。 主要流程 整个处理的主要步骤分为以下: Linux v4l2驱动采集... 阅读详情

相关推荐

linux:通过v4l2命令列出当前系统支持的camera图像format和帧率

个人实战: “In Linux, command line utility v4l2-ctl displays all of a webcam’s natively supported formats – install it with sudo apt-get install v4l-utils, run it with v4l2-ctl -dX --list-formats-ext wher...

lgfun的专栏 7081

Linux下V4L2实时显示摄像头捕捉画面

Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。 在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/video0。 连接摄像头设备到虚拟机.

Cgs723的博客 9138

嵌入式-v4l2摄像头的工作流程及ioctl功能详解

一.摄像头的工作流程 1.打开设备文件int fd=open("/dev/video0",O_RDWR);2.取得设备的capability,看看设备具体支持哪些功能,比如是否具有视频的输入或者音频的输入等等ioctl(fd_v4l, VIDIOC_QUERYCAP, &cap) 3. 设置视频采集的参数: 设置视频的制式,制式包括PAL/NTSC,使用 ioctl(fd_v4l, VID

mf_happying的博客 1万+

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

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

sxj731533730 2604

TQ2440开发板综合测试与原理图分析

本文还有配套的精品资源,点击获取 简介:TQ2440作为基于Samsung S3C2440处理器的嵌入式开发板,在开发领域有着广泛的应用。文章深入解析了裸跑程序的开发和应用,以及相关的硬件设计如PCB布局、布线和原理图的详细信息。还涉及到使用ADS1.2工具链进行开发和调试,以及TQ2440测试程序,旨在提供完整的开发实例,并帮助开发者理解和应用S3C2440处理器的特性。...

weixin_42327217的博客 2793

TQ2440 LCD三色显示裸机程序全解析

TQ2440是一款基于ARM920T核心的微处理器,广泛应用于嵌入式系统领域,因其高性能和低功耗而受到开发者的青睐。它具备丰富的接口资源,能够方便地连接各种外围设备,是学习和开发嵌入式系统的理想选择。液晶显示(Liquid Crystal Display, LCD)技术起源于20世纪70年代,其首次商业化应用是在1972年由瑞士手表厂商Hoffman-La Roche实现。LCD技术的基础在于液晶材料的特性——在一定温度范围内,液晶分子具有有序排列的光学特性,并能对电场变化作出响应。

weixin_42504649的博客 295

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

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

Chasing_Chasing的博客 1083

基于QT的V4L2摄像头视频采集并显示

基于QT开发的V4L2摄像头视频采集,并使用QLable实现摄像头图像的刷新显示。

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

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

sxjk1987的专栏 9918

使用Linux的V4L2读取摄像头数据+Opencv图像处理

使用原始的RGB数据构造Opencv中的Mat对象。该资源使用Linux系统中的V4L2接口读取摄像头MJPEG图像数据,解码成RGB数据,再转换为Opencv中的Mat对象所使用的BGR格式

从按键开机到I2C隔离:手把手拆解一个智能硬件项目里的MOS管实战配置

本文详细解析了智能硬件项目中MOS管的实战配置,从按键开机电路到I2C总线隔离,全面覆盖电源管理和信号隔离的关键技术。通过PMOS+NMOS组合方案实现可靠的开机功能,并采用双NMOS方案优化I2C通信隔离,提升系统稳定性和信号质量。

weixin_28691741的博客 326

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

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

iRobot的专栏 5187

Windows MCP 安装教程:让 AI 代理与 Windows 系统无缝交互

通过以上步骤,你已经成功安装和配置了 Windows MCP 服务。现在你的 Cursor 编辑器可以通过 MCP 协议与 Windows 系统进行深度交互,AI 代理能够:启动和控制应用程序执行系统命令自动化 UI 操作获取系统状态信息这为 AI 辅助开发和工作流程自动化提供了强大的基础。如果你在使用过程中遇到任何问题,欢迎在评论区讨论或查看项目的官方文档。

chenchihwen的专栏 3351

TQ2440移植Android的问题2

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

钱国正的专栏 1327

喷涂机器人系列编程:ABB IRB 5500_(9).常见故障诊断与排除

ABB IRB 5500 喷涂机器人在实际应用中可能会遇到各种故障,但通过系统的诊断和排除方法,可以确保生产线的连续运行。定期维护和保养是预防故障的重要手段,而操作培训和规范则能有效减少人为因素引起的故障。希望本节内容能帮助操作和维护人员提高故障诊断和排除的效率,确保喷涂机器人的稳定运行。如果您有任何疑问或需要进一步的帮助,请联系 ABB 客户服务中心。

zhubeibei168的博客 1045

由浅入深的详细解读汽车PDU与BDU

本文详细解读新能源汽车的PDU高压配电单元和BDU电池包断路单元,涉及电气件参数设计、选型、结构设计、电气安全、散热设计、继电器控制与诊断,提供汽车电子知识和技术解析。

让你爱上电路设计 1万+

Linux(V4L2驱动)下获得Opencv摄像头属性(图像输出格式和是否发生往RGB的转换)的方法

Opencv可通过cvGetCaptureProperty函数(或者VideoCapture::get(int proID))来获取摄像头输出图像的属性。但返回的是个double的值,如何查看图像输出的编码格式呢? 其实可以看到,编码格式是个宏定义,只要有了编码格式的宏定义,我们就可以把得到的doule类型的值和各种编码格式宏对比,即可得知获得的double值是哪种编码格式。 V4L2各种编码

jirryzhang的博客 4011

华为OD新系统机试真题 - API请求日志去重分析

华为OD新系统机试真题【API请求日志去重分析】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【API请求日志去重分析】

qq_45776114的博客 915

Linux下使用V4L2读取获取拍照(获取静态图像)

Linux下使用V4L2读取获取拍照(获取静态图像) #include <linux/videodev2.h> 1. 打开设备 intfd=open("/dev/video0",O_RDWR); 2. 查询设备属性 structv4l2_capabilitycap; ioctl(fd,VIDIOC_QUERYCAP,&cap); 3. 设置图像帧格式和像素大小 structv4l2_formatfmt...

smartvxworks的博客 2612

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 732

石油化工软件:ProII二次开发_(9).案例研究:ProII二次开发实例

我们将上述三个步骤整合到一个完整的案例中,展示如何从头到尾实现一个ProII二次开发项目。这个项目包括自动化流程模拟、数据处理与分析以及动态工艺参数调整。

kkchenjj的博客 918

linux驱动移植-usb摄像头采集图像实时显示(v4l2应用)

一、V4L2 1.1 介绍 V4L2是video for Linux 2的缩写,是一套Linux内核视频设备的驱动框架,该驱动框架为应用层提供一套统一的操作接口(一系列的ioctl)。 V4L2在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备,可以支持多种设备,它可以有以下几种接口。 video capture interface:视频捕获接口,这种接口应用于摄像...

Graceful_scenery的博客 1146

元宇宙通证- 九、IT/ICT发展史全景长图

九、IT/ICT发展史全景长图 (一)综述 IT是Information Technology的缩写,意为”信息技术“,包含现代计算机、网络、通信等信息领域技术。自1844年人类历史上发出来第一份电报,实现了信息的长图传输,信息技术发展的历史大幕随之拉开。信息技术的普遍应用,是进入信息社会的标志。 IT技术最早发源于半导体,然后发展处计算机、通信网和互联网,进而演进到现在的AI、XR、计算机、大数据、物联网、工业互联网、区块链、量子计算等。 有人说元宇宙是下一代互联网,有人说元宇宙是互联网的终极形态。 我们

沧海之巅的专栏 1万+

linux之V4L2摄像头应用流程

 对于v4l2,上次是在调试收音机驱动的时候用过,其他也就只是用i2c配置一些寄存器就可以了。那时只是粗粗的了解了,把收音机当作v4l2的设备后会在/dev目录下生成一个radio的节点。然后就可以操作了。后来就没怎么接触了。这周,需要调试下usb的摄像头。因为有问题,所以就要跟进,于是也就要开始学习下linux的v4l2了。看到一篇很不错的文章,下面参考这篇文章,加上自己的一些见解,做一些总结把。  Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是

u014583317的博客 446

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从Framebuffer讲解V4L2摄像头编程(配正点原子例程)

本文主要转载正点原子的【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4里的内容,从FrameBuffer开始讲解直至基于V4L2框架的摄像头数据采集实现(急着用例程也可以不看讲解)

mafumafu65的博客 2235

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

使用V4L2读取摄像头并在LCD上显示

我的环境是友善之臂的fire3,Ubuntu1604,使用的是uvc免驱摄像头 大致的工作流程如下 一、获取摄像头图片 1、打开摄像头 2、获取摄像头的一些信息,比如支持的格式等等 3、设置摄像头的一些参数,比如输出格式等等 4、申请缓冲区 5、内存映射 6、开始采集 二、将图片在lcd上显示出来 1、打开lcd的设备fb0,如果没有这个,恭喜。 2、获取一些lcd的信息,如...

qq_39545674的博客 3720

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: lrzsz.0.12.20安装与出现的/usr/bin/lrz: line 1: syntax error: "(" unexpected问题
下一篇: QT 实现在ui控件QLabel中实现滚动字幕
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值