一 opencv 安装
1.安装
ubuntu下opencv 安装比较简单,直接使用命令
sudo apt-get install libopencv-dev
可以看到很多相关包都会被安装:
2.测试
安装后用简单代码进行测试
/****opencv_test.cpp***/
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat testImage = imread("test.png");
imshow("testIMage",testImage);
waitKey(0);
return 0;
}
makefile
INCLUDE = $(shell pkg-config --cflag opencv)
LIBS = $(shell pkg-config --libs opencv)
BIN = opencv
OBJECTS = opencv_test.o
SOURCES = opencv_test.cpp
$(BIN):$(OBJECTS)
g++ -o $(BIN) $(OBJECTS) -I $(INCLUDE) $(LIBS)
$(OBJECTS):$(SOURCES)
g++ -c $(SOURCES)
clean:
rm $(OBJECT) $(BIN)
二 opencv 打开摄像头
ubuntu 一般通过v4l2拿取图像,然后把图像交给opencv即可显示处理。 另外opencv 也提供了打开摄像头接口,对v4l2的实现进行了封装,可以满足基本的使用。下面就分别介绍下两种方式
1. 使用VideoCapture获取图像
直接上代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char *argv[])
{
cv::VideoCapture capture;
capture.open(0); //打开摄像头,只要一个摄像头,默认是0; 笔记本上有自带的摄像头,再插入usb摄像头应该是1
if(capture.isOpened()) //打开摄像头
{
std::cout<<"video is open";
}
cv::Mat frame; //定义一个矩阵接受帧
cv::namedWindow("camera",1); //定义显示帧
int i=0;
for(;;)
{
capture>>frame; //取出一帧
if (!frame.empty())
{
cv::imshow("camera", frame); //在窗口显示
i++;
std::cout<<i<<"\n";
}
else
{
}
cv::waitKey(30);
}
return 0;
}
2 . 使用v4l2获取图像
相对于VideoCapture,v4l2能提供更多控制摄像头的功能。
v4l2的代码看起来比较繁杂, 其实大部分是出错处理,关键代码就几步
1. 打开设备
fd = open(dev_name, O_RDWR /* required */ | O_NONBLOCK, 0);
2. 初始化mmap
static void init_mmap(void)
{
struct v4l2_requestbuffers req;
CLEAR(req);
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
buffers = (PBUF)calloc(req.count, sizeof(*buffers));
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;
buffers[n_buffers].length = buf.length;
buffers[n_buffers].start =
mmap(NULL /* start anywhere */,
buf.length,
PROT_READ | PROT_WRITE /* required */,
MAP_SHARED /* recommended */,
fd, buf.m.offset);
}
}
3. 启动摄像头采集数据
if (-1 == xioctl(fd, VIDIOC_STREAMON, &type))
4. 读取一帧
if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf))
5. v4l2 数据转mat
cv::Mat yuvImg;
cv::Mat rgbImg(ROWS, COLS,CV_8UC3);
yuvImg.create(ROWS , COLS, CV_8UC2);
memcpy(yuvImg.data, p, COLS*ROWS*2);
cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_YUYV); //p 为v4l2数据
完整代码:https://download.csdn.net/download/zxf20063033/10877502