日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 远程挂载摄像头_如何实现嵌入式Linux下USB摄像头视频采集

發布時間:2023/12/2 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 远程挂载摄像头_如何实现嵌入式Linux下USB摄像头视频采集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

展開全部

在linux下所e5a48de588b662616964757a686964616f31333337613134有設備都是文件。所以對攝像頭的操作其實就是對文件的操作。USB攝像頭的設備文件就是在/dev目錄下的video0(假如只有一個攝像頭)。在linux下操作攝像頭就是使用v4l2對攝像頭進行視頻的操作,操作步驟如下

1. 打開設備文件。

int fd=open(”/dev/video0″,O_RDWR);

2. 取得設備的capability,看看設備具有什么功能,比如是否具有視頻輸入,或者音頻輸入輸出等。VIDIOC_QUERYCAP,struct v4l2_capabilityv4l2_std_id?std;

do?{

ret=?ioctl(fd,?VIDIOC_QUERYSTD,?&std);

}?while?(ret?==?-1?&&?errno?==?EAGAIN);

switch?(std)?{

case?V4L2_STD_NTSC:

//……

case?V4L2_STD_PAL:

//……

}

3. 選擇視頻輸入,一個視頻設備可以有多個視頻輸入。VIDIOC_S_INPUT,struct v4l2_input(可不要)

4. 設置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個包括寬度和高度等。

VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_formatstruct?v4l2_format?fmt;

memset?(?&fmt,?0,?sizeof(fmt)?);

fmt.type?=?V4L2_BUF_TYPE_VIDEO_CAPTURE;

fmt.fmt.pix.width?=?320;

fmt.fmt.pix.height?=?240;

fmt.fmt.pix.pixelformat?=?V4L2_PIX_FMT_JPEG;

if?(ioctl(fd,?VIDIOC_S_FMT,?&fmt)?

{

printf("set?format?failed\n");

//return?0;

}

5. 向驅動申請幀緩沖,一般不超過5個。struct v4l2_requestbuffersstruct?v4l2_requestbuffers?req;

memset(&req,?0,?sizeof?(req));

req.count?=?4;

req.type?=?V4L2_BUF_TYPE_VIDEO_CAPTURE;

req.memory?=?V4L2_MEMORY_MMAP;

if?(ioctl(fd,VIDIOC_REQBUFS,&req)?==?-1)

{

perror("VIDIOC_REQBUFS?error?\n");

//return?-1;

}

6.申請物理內存

將申請到的幀緩沖映射到用戶空間,這樣就可以直接操作采集到的幀了,而不必去復制。將申請到的幀緩沖全部入隊列,以便存放采集到的數據.VIDIOC_QBUF,struct v4l2_bufferVideoBuffer*?buffers?=?calloc(?req.count,?sizeof(VideoBuffer)?);

printf("sizeof(VideoBuffer)?is?%d\n",sizeof(VideoBuffer));

struct?v4l2_buffer?buf;

for?(numBufs?=?0;?numBufs?

{

memset(?&buf,?0,?sizeof(buf)?);

buf.type?=?V4L2_BUF_TYPE_VIDEO_CAPTURE;

buf.memory?=?V4L2_MEMORY_MMAP;

buf.index?=?numBufs;

if?(ioctl(fd,?VIDIOC_QUERYBUF,?&buf)?

{

printf("VIDIOC_QUERYBUF?error\n");

//return?-1;

}

printf("buf?len?is?%d\n",sizeof(buf));

//內存映射

buffers[numBufs].length?=?buf.length;

buffers[numBufs].offset?=?(size_t)?buf.m.offset;

buffers[numBufs].start?=?mmap?(NULL,?buf.length,PROT_READ?|?PROT_WRITE,?MAP_SHARED,?fd,?buf.m.offset);

printf("buffers.length?=?%d,buffers.offset?=?%d?,buffers.start[0]?=?%d\n",buffers[numBufs].length,buffers[numBufs].offset,buffers[numBufs].start[0]);

printf("buf2?len?is?%d\n",sizeof(buffers[numBufs].start));

if?(buffers[numBufs].start?==?MAP_FAILED)

{

perror("buffers?error\n");

//return?-1;

}

if?(ioctl?(fd,?VIDIOC_QBUF,?&buf)?

{

printf("VIDIOC_QBUF?error\n");

//return?-1;

}

}

7. 開始視頻的采集。enum?v4l2_buf_type?type;

type?=?V4L2_BUF_TYPE_VIDEO_CAPTURE;

if?(ioctl?(fd,?VIDIOC_STREAMON,?&type)?

{

printf("VIDIOC_STREAMON?error\n");

//?return?-1;

}

8. 出隊列以取得已采集數據的幀緩沖,取得原始采集數據。VIDIOC_DQBUF, 將緩沖重新入隊列尾,這樣可以循環采集。VIDIOC_QBUFif?(ioctl(fd,?VIDIOC_DQBUF,?&buf)?

{

perror("VIDIOC_DQBUF?failed.\n");

//return?-1;

}

buf.type?=?V4L2_BUF_TYPE_VIDEO_CAPTURE;

buf.memory?=?V4L2_MEMORY_MMAP;

unsigned?char?*ptcur?=?buffers[numBufs].start;

DEBUG("buf.bytesused?=?%d?\n",buf.bytesused);

int?i1;

for(i1=0;?i1

{

if((buffers[numBufs].start[i1]?==?0x000000FF)?&&?(buffers[numBufs].start[i1+1]?==?0x000000C4))

{

DEBUG("huffman?table?finded!?\nbuf.bytesused?=?%d\nFFC4?=?%d?\n",buf.bytesused,i1);

break;

}

}

if(i1?==?buf.bytesused)printf("huffman?table?don't?exist!?\n");

int?i;

for(i=0;?i

{

if((buffers[numBufs].start[i]?==?0x000000FF)?&&?(buffers[numBufs].start[i+1]?==?0x000000D8))?break;

ptcur++;

}

DEBUG("i=%d,FF=%02x,D8=%02x\n",i,buffers[numBufs].start[i],buffers[numBufs].start[i+1]);

int?imagesize?=buf.bytesused?-?i;

DEBUG("buf.bytesused?=?%d?\n",buf.bytesused);

DEBUG?("imagesize?=?%d?\n",imagesize);

9. 停止視頻的采集。VIDIOC_STREAMOFF

10. 關閉視頻設備。close(fd);

總結

以上是生活随笔為你收集整理的linux 远程挂载摄像头_如何实现嵌入式Linux下USB摄像头视频采集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。