在虚拟机搭建好系统后,真正的使用才刚刚开始。
在使用摄像头的时候,首先看自己的摄像头插上去是显示jpeg的还是yuv的
yuv的要实现UVC转QImage转IplImage这样的流程才能使用,jpeg的好多人不会用说没用其实最好用了。一点不卡。yuv的有点卡。
我用的也是yuv以前朋友用的jpeg的摄像头。
代码是用的网上的一个代码修改的
1. [文件] videodevice.h ?
|
#ifndef VIDEODEVICE_H
#define VIDEODEVICE_H
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/types.h>
#include <linux/videodev2.h>
#include <QString>
#include <QObject>
#define CLEAR(x) memset(&(x), 0, sizeof(x))
class
VideoDevice :
public
QObject
{
Q_OBJECT
public
:
VideoDevice(QString dev_name);
//VideoDevice();
int
open_device();
int
close_device();
int
init_device();
int
start_capturing();
int
stop_capturing();
int
uninit_device();
int
get_frame(
void
**,
size_t
*);
int
unget_frame();
private
:
int
init_mmap();
struct
buffer
{
void
* start;
size_t
length;
};
QString dev_name;
int
fd;
buffer* buffers;
unsigned
int
n_buffers;
int
index;
signals:
void
display_error(QString);
};
#endif // VIDEODEVICE_H
|
2. [文件] videodevice.cpp
#include "videodevice.h"
VideoDevice::VideoDevice(QString dev_name)
{
this
->dev_name = dev_name;
this
->fd = -1;
this
->buffers = NULL;
this
->n_buffers = 0;
this
->index = -1;
}
int
VideoDevice::open_device()
{
fd = open(dev_name.toStdString().c_str(), O_RDWR
/*|O_NONBLOCK*/
, 0);
// fd = open(dev_name.toStdString().c_str(), O_RDWR|O_NONBLOCK, 0);
if
(-1 == fd)
{
emit display_error(tr(
"open: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
}
return
0;
}
int
VideoDevice::close_device()
{
if
(-1 == close(fd))
{
emit display_error(tr(
"close: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
}
return
0;
}
int
VideoDevice::init_device()
{
v4l2_capability cap;
v4l2_cropcap cropcap;
v4l2_crop crop;
v4l2_format fmt;
if
(-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap))
{
if
(EINVAL ==
errno
)
{
emit display_error(tr(
"%1 is no V4l2 device"
).arg(dev_name));
}
else
{
emit display_error(tr(
"VIDIOC_QUERYCAP: %1"
).arg(QString(
strerror
(
errno
))));
}
return
-1;
}
if
(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
{
emit display_error(tr(
"%1 is no video capture device"
).arg(dev_name));
return
-1;
}
if
(!(cap.capabilities & V4L2_CAP_STREAMING))
{
emit display_error(tr(
"%1 does not support streaming i/o"
).arg(dev_name));
|