自学内容网 自学内容网

Linux 外设驱动 应用 6 摄像头采集实验 part2

摄像头采集实验

Part 1 Linux 外设驱动 应用 6 摄像头采集实验
Part 2 Linux 外设驱动 应用 6 摄像头采集实验



7 opecv介绍

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,旨在提供高效、实用的图像处理和计算机视觉功能。它最初由Intel公司开发,现由一个庞大的社区进行维护和更新。OpenCV广泛应用于实时图像处理、视频分析、机器学习等领域。

OpenCV的主要功能:
图像处理:

  • 图像滤波:如模糊、锐化、降噪等。
  • 几何变换:如旋转、缩放、裁剪、仿射变换、透视变换等。
  • 边缘检测:如Sobel、Canny算法。
  • 颜色空间转换:如RGB到灰度图、HSV转换等。

物体检测:

  • 人脸检测:通过Haar级联分类器或者深度学习方法进行人脸检测。
  • 特征点匹配:如ORB、SIFT、SURF等方法检测和匹配特征点。
  • 物体追踪:例如基于KLT算法、Meanshift和Camshift的追踪算法。

机器学习:

  • 分类算法:如支持向量机(SVM)、K近邻(k-NN)、决策树等。
  • 聚类算法:如K-means、层次聚类等。
  • 深度学习支持:OpenCV与TensorFlow、PyTorch、Caffe等深度学习框架兼容,支持图像分类、目标检测等任务。

视频分析:

  • 实时视频处理:支持视频的读取、显示和编辑。
  • 运动分析:如光流法、背景减除法、运动物体检测等。
  • 视频稳定:对视频进行去抖动处理。

三维重建与姿态估计:

  • 立体视觉:通过左右图像对来估计深度图。
  • 相机标定与姿态估计:估算相机的内参、外参,以及三维物体的姿态。
  • 三维物体重建:从2D图像推断物体的三维结构。

GUI和高级函数:

  • 提供图像、视频的显示功能。
  • 支持绘制图形,如矩形、圆形、文本等。

8 摄像头操作

在OpenCV中,操作摄像头主要使用cv2.VideoCapture类来实现。通过该类,你可以捕获来自摄像头的视频流,进行实时图像处理等操作。以下是一些常见的摄像头操作示例。

8.1 打开摄像头并显示视频流

最基本的操作是打开摄像头并显示实时视频流。你可以通过cv2.VideoCapture类来打开摄像头,使用read()方法获取每一帧图像,然后用imshow()显示。

#include <opencv2/opencv.hpp>
#include"cv.h"
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc,char* argv[])
{
VideoCapture cap(1);

        if(!cap.isOpened())
        {
                cout<<"create camera capture error"<<endl;
                return -1;
        }
Mat frame;
while (true) {
// 捕获每一帧
cap >> frame;
if (frame.empty()) {
std::cerr << "无法获取视频帧" << std::endl;
break;
        }
 // 显示视频帧
        cv::imshow("摄像头视频", frame);

        // 按'q'键退出
        if (cv::waitKey(1) == 'q') {
            break;
}
        }
        cap.release();
        cvDestroyAllWindows();
        return 0;
}

添加Makefile 的opencv库

CFLAGS :=$(shell pkg-config --cflags opencv)
LBFLAGS :=$(shell pkg-config --libs opencv) -lstdc++

在这里插入图片描述

8.2 保存图像

// 保存图像
    cv::imwrite("captured_image.jpg", frame);
    std::cout << "图像已保存" << std::endl;

在这里插入图片描述

8.3 捕获视频平且保存

int main() {
    // 打开摄像头
    cv::VideoCapture cap(1);
    if (!cap.isOpened()) {
        std::cerr << "无法打开摄像头" << std::endl;
        return -1;
    }

    // 设置视频编解码器和输出文件
    cv::VideoWriter writer("output.avi", cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), 30.0, cv::Size(640, 480));

    cv::Mat frame;
    while (true) {
        // 捕获每一帧
        cap >> frame;
        if (frame.empty()) {
            std::cerr << "无法获取视频帧" << std::endl;
            break;
        }

        // 保存视频帧
        writer.write(frame);

        // 显示视频帧
        cv::imshow("录制视频", frame);

        // 按'q'键退出
        if (cv::waitKey(1) == 'q') {
            break;
        }
    }

    cap.release();
    writer.release();
    cv::destroyAllWindows();
    return 0;
}

8.4 获取摄像头属性

double width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    double height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    double fps = cap.get(cv::CAP_PROP_FPS);

    std::cout << "摄像头分辨率: " << width << "x" << height << std::endl;
    std::cout << "帧率: " << fps << " FPS" << std::endl;

9 查看摄像头索引号

 ls /dev/video*

或者

v4l2-ctl --list-devices

原文地址:https://blog.csdn.net/huanghongqi11/article/details/144325765

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!