摄像头采集实验
Part 1 Linux 外设驱动 应用 6 摄像头采集实验
Part 2 Linux 外设驱动 应用 6 摄像头采集实验
文章目录
- 摄像头采集实验
- 7 opecv介绍
- 8 摄像头操作
- 8.1 打开摄像头并显示视频流
- 8.2 保存图像
- 8.3 捕获视频平且保存
- 8.4 获取摄像头属性
- 9 查看摄像头索引号
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