Ubuntu 下使用opencv打开usb 摄像头

一 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

 

 

 

 

 

 

 

 

 

 

 

 

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值