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)!