移植opencv到开发板,摄像头在开发板6410上的采集使用
Posted 随波足流
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移植opencv到开发板,摄像头在开发板6410上的采集使用相关的知识,希望对你有一定的参考价值。
在虚拟机搭建好系统后,真正的使用才刚刚开始。
在使用摄像头的时候,首先看自己的摄像头插上去是显示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));
return
-1;
CLEAR(cropcap);
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if
(0 == ioctl(fd, VIDIOC_CROPCAP, &cropcap))
CLEAR(crop);
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.defrect;
if
(-1 == ioctl(fd, VIDIOC_S_CROP, &crop))
if
(EINVAL ==
errno
)
// emit display_error(tr("VIDIOC_S_CROP not supported"));
else
emit display_error(tr(
"VIDIOC_S_CROP: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
else
emit display_error(tr(
"VIDIOC_CROPCAP: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
CLEAR(fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 640;
fmt.fmt.pix.height = 480;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if
(-1 == ioctl(fd, VIDIOC_S_FMT, &fmt))
emit display_error(tr(
"VIDIOC_S_FMT"
).arg(QString(
strerror
(
errno
))));
return
-1;
if
(-1 == init_mmap())
return
-1;
return
0;
int
VideoDevice::init_mmap()
v4l2_requestbuffers req;
CLEAR(req);
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if
(-1 == ioctl(fd, VIDIOC_REQBUFS, &req))
if
(EINVAL ==
errno
)
emit display_error(tr(
"%1 does not support memory mapping"
).arg(dev_name));
return
-1;
else
emit display_error(tr(
"VIDIOC_REQBUFS %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
if
(req.count < 2)
emit display_error(tr(
"Insufficient buffer memory on %1"
).arg(dev_name));
return
-1;
buffers = (buffer*)
calloc
(req.count,
sizeof
(*buffers));
if
(!buffers)
emit display_error(tr(
"out of memory"
));
return
-1;
for
(n_buffers = 0; n_buffers < req.count; ++n_buffers)
v4l2_buffer buf;
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;
if
(-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
emit display_error(tr(
"VIDIOC_QUERYBUF: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
buffers[n_buffers].length = buf.length;
buffers[n_buffers].start =
mmap(NULL,
// start anywhere
buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd, buf.m.offset);
if
(MAP_FAILED == buffers[n_buffers].start)
emit display_error(tr(
"mmap %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
return
0;
int
VideoDevice::start_capturing()
unsigned
int
i;
for
(i = 0; i < n_buffers; ++i)
v4l2_buffer buf;
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
buf.index = i;
// fprintf(stderr, "n_buffers: %d\\n", i);
if
(-1 == ioctl(fd, VIDIOC_QBUF, &buf))
emit display_error(tr(
"VIDIOC_QBUF: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if
(-1 == ioctl(fd, VIDIOC_STREAMON, &type))
emit display_error(tr(
"VIDIOC_STREAMON: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
return
0;
int
VideoDevice::stop_capturing()
v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if
(-1 == ioctl(fd, VIDIOC_STREAMOFF, &type))
emit display_error(tr(
"VIDIOC_STREAMOFF: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
return
0;
int
VideoDevice::uninit_device()
unsigned
int
i;
for
(i = 0; i < n_buffers; ++i)
if
(-1 == munmap(buffers[i].start, buffers[i].length))
emit display_error(tr(
"munmap: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
free
(buffers);
return
0;
int
VideoDevice::get_frame(
void
**frame_buf,
size_t
* len)
v4l2_buffer queue_buf;
CLEAR(queue_buf);
queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queue_buf.memory = V4L2_MEMORY_MMAP;
if
(-1 == ioctl(fd, VIDIOC_DQBUF, &queue_buf))
switch
(
errno
)
case
EAGAIN:
// perror("dqbuf");
return
-1;
case
EIO:
return
-1 ;
default
:
emit display_error(tr(
"VIDIOC_DQBUF: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
*frame_buf = buffers[queue_buf.index].start;
*len = buffers[queue_buf.index].length;
index = queue_buf.index;
return
0;
int
VideoDevice::unget_frame()
if
(index != -1)
v4l2_buffer queue_buf;
CLEAR(queue_buf);
queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queue_buf.memory = V4L2_MEMORY_MMAP;
queue_buf.index = index;
if
(-1 == ioctl(fd, VIDIOC_QBUF, &queue_buf))
emit display_error(tr(
"VIDIOC_QBUF: %1"
).arg(QString(
strerror
(
errno
))));
return
-1;
return
0;
return
-1;
|
3. [文件] processImage.h
|
#ifndef PROCESSIMAGE_H
#define PROCESSIMAGE_H
#include <QtGui>
#include "videodevice.h"
class
ProcessImage :
public
QWidget
Q_OBJECT
public
:
ProcessImage(QWidget *parent=0);
~ProcessImage();
private
:
QPainter *painter;
QLabel *label;
QImage *frame;
//QPixmap *frame;
QTimer *timer;
int
rs;
uchar *pp;
uchar * p;
unsigned
int
len;
int
convert_yuv_to_rgb_pixel(
int
y,
int
u,
int
v);
int
convert_yuv_to_rgb_buffer(unsigned
char
*yuv, unsigned
char
*rgb, unsigned
int
width, unsigned
int
height);
VideoDevice *vd;
private
slots:
void
paintEvent(QPaintEvent *);
void
display_error(QString err);
;
#endif
|
4. [文件] processImage.cpp
|
#include <QtGui>
#include "processImage.h"
#include "videodevice.h"
extern
"C"
#include <stdio.h>
#include <stdlib.h>
ProcessImage::ProcessImage(QWidget *parent):QWidget(parent)
pp = (unsigned
char
*)
malloc
(640 * 480
/*QWidget::width()*QWidget::height()*/
* 3 *
sizeof
(
char
));
painter =
new
QPainter(
this
);
frame =
new
QImage(pp,640,480,QImage::Format_RGB888);
// frame = new QPixmap(640,320);
label =
new
QLabel();
vd =
new
VideoDevice(tr(
"/dev/video0"
));
connect(vd, SIGNAL(display_error(QString)),
this
,SLOT(display_error(QString)));
rs = vd->open_device();
if
(-1==rs)
QMessageBox::warning(
this
,tr(
"error"
),tr(
"open /dev/dsp error"
),QMessageBox::Yes);
vd->close_device();
rs = vd->init_device();
if
(-1==rs)
QMessageBox::warning(
this
,tr(
"error"
),tr(
"init failed"
),QMessageBox::Yes);
vd->close_device();
rs = vd->start_capturing();
if
(-1==rs)
QMessageBox::warning(
this
,tr(
"error"
),tr(
"start capture failed"
),QMessageBox::Yes);
vd->close_device();
if
(-1==rs)
QMessageBox::warning(
this
,tr(
"error"
),tr(
"get frame failed"
),QMessageBox::Yes);
vd->stop_capturing();
timer =
new
QTimer(
this
);
connect(timer,SIGNAL(timeout()),
this
,SLOT(update()));
以上是关于移植opencv到开发板,摄像头在开发板6410上的采集使用的主要内容,如果未能解决你的问题,请参考以下文章
|