u**摄像头编程,linux下怎样进行摄像头编程
一、摄像头可以连笔记本电脑吗
USB摄像头当然可以。插在USB插口就可以使用了。但是,Win98、叉屁时代的摄像头,虽然也是USB接口的,现在系统不支持了。这种摄像头,支持标准API,也就是通过编程可以控制摄像头。所以,所有的网络会议、聊天、远程控制进行偷敏感字眼儿窥都是用这种摄像头。
**输出的,你的笔记本需要配置USB采集卡才可以用。应用同上。实际上是USB采集卡。
高清HDMI输出,需要配置采集卡,这种采集卡类似USB摄像头,也支持标准API调用。
网络摄像头,笔记本电脑要将IP地址和摄像头IP地址放在同一个地址段,然后使用相应的软件查看。网络摄像头,通常没有标准API调用,通常不支持聊天软件。但是技术实力强大的厂商,比如海康威视,有标准程序接口,比Windows的API调用还方便。
上述笔记本电脑,指的是普通笔记本电脑,对于苹果MAC笔记本电脑不适用。
只有极少数摄像头支持苹果笔记本电脑。
二、电脑摄像头的插头那端是插在哪儿
摄像头的插头那端插到电脑的USB接口就可以。前置USB或者后置USB接口都可以。是一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。
USB接口可连接多种外设,如鼠标和键盘等。USB是在1994年底由英特尔等多家公司联合在1996年推出后,已成功替代串口和并口,已成为当今电脑与大量智能设备的必配接口。USB版本经历了多年的发展,到如今已经发展为3.0版本。
对于大多数工程师来说,开发USB2.0接口产品主要障碍在于:要面对复杂的USB2.0协议、自己编写USB设备的驱动程序、熟悉单片机的编程。这不仅要求有相当的VC编程经验、还能够编写USB接口的硬件(固件)程序。所以大多数人放弃了自己开发USB产品。
三、linux下怎样进行摄像头编程
在linux下所有设备都是文件。所以对摄像头的*作其实就是对文件的*作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下*作摄像头就是使用v4l2对摄像头进行的*作,*作步骤如下
int fd=open(”/dev/video0″,O_RDWR);
2.取得设备的capa**lity,看看设备具有什么功能,比如是否具有输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capa**lity
ret= ioctl(fd, VIDIOC_QUERYSTD, std);
} while(ret==-1 errno== EAGAIN);
3.选择输入,一个设备可以有多个输入。VIDIOC_S_INPUT,struct v4l2_input(可不要)
4.设置的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
fmt.type= V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.pixelformat= V4L2_PIX_FMT_JPEG;
if(ioctl(fd, VIDIOC_S_FMT, fmt)< 0)
printf("set format failed\n");
5.向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers
struct v4l2_requestbuffers req;
req.type= V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(ioctl(fd,VIDIOC_REQBUFS,req)==-1)
perror("VIDIOC_REQBUFS error \n");
将申请到的帧缓冲映射到用户空间,这样就可以直接*作采集到的帧了,而不必去**。将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer
VideoBuffer* buffers= calloc( req.count, sizeof(VideoBuffer));
printf("sizeof(VideoBuffer) is%d\n",sizeof(VideoBuffer));
for(numBufs= 0; numBufs< req.count; numBufs++)
buf.type= V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(ioctl(fd, VIDIOC_QUERYBUF, buf)< 0)
printf("VIDIOC_QUERYBUF error\n");
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)
if(ioctl(fd, VIDIOC_QBUF, buf)< 0)
printf("VIDIOC_QBUF error\n");
type= V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(ioctl(fd, VIDIOC_STREAMON, type)< 0)
printf("VIDIOC_STREAMON error\n");
8.出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF,将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
if(ioctl(fd, VIDIOC_DQBUF, buf)< 0)
perror("VIDIOC_DQBUF failed.\n");
buf.type= V4L2_BUF_TYPE_VIDEO_CAPTURE;
unsigned char*ptcur= buffers[numBufs].start;
DEBUG("buf.bytesused=%d \n",buf.bytesused);
for(i1=0; i1<buf.bytesused; i1++)
if((buffers[numBufs].start[i1]== 0xFF)(buffers[numBufs].start[i1+1]== 0xC4))
DEBUG("huffman table finded! \nbuf.bytesused=%d\nFFC4=%d \n",buf.bytesused,i1);
if(i1== buf.bytesused)printf("huffman table don't exist! \n");
for(i=0; i<buf.bytesused; i++)
if((buffers[numBufs].start[i]== 0xFF)(buffers[numBufs].start[i+1]== 0xD8)) break;
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
四、PLC如何接受摄像头端的数据
你是想视觉运动控制哇!视频采集的信号用软件处理后的控制数据通过和plc的通讯功能来进行传输!实时性要求高的话!恐怕还没有那家plc能直接处理大容量数据流的视频信号的功能哦!除非专用的特殊控制器!或者用FPGA嵌入式开发的控制器这个成本就高咯!应该有专用的控制器