OpenEuler操作系统测试USB摄像头
OpenEuler操作系统测试USB摄像头
测试摄像头是829万像素摄像头模组 IMX678
MIPI 转接 TypeC 再转接 USB 3.0
将摄像头接入工控机,在工控机中OpenEuler操作系统中查看是否有该设备信息
lsusb
查看一下视频设备路径
ls -l /dev/video*
用opencv写一个拍摄并保存图片的代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>using namespace cv;
using namespace std;int main() {// 打开指定设备路径的摄像头VideoCapture cap("/dev/video0");// 检查摄像头是否成功打开if (!cap.isOpened()) {cerr << "无法打开摄像头(路径:/dev/video0)" << endl;return -1;}// 设置摄像头分辨率cap.set(CAP_PROP_FRAME_WIDTH, 1920); cap.set(CAP_PROP_FRAME_HEIGHT, 1080); // 捕获一帧图像Mat frame;cap >> frame;// 检查图像是否成功捕获if (frame.empty()) {cerr << "无法捕获图像" << endl;return -1;}// 保存图像string filename = "hbvcam_captured.jpg";bool saved = imwrite(filename, frame);if (saved) {cout << "图像已成功保存为: " << filename << endl;} else {cerr << "无法保存图像" << endl;return -1;}// 释放摄像头cap.release();return 0;
}
我发现如果我直接设置摄像头分辨率
// 设置摄像头分辨率
cap.set(CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
就会如下报错
后来将usb插入到Windows上用软件查看了一下摄像头信息
修改代码,将格式设置为MJPG
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>using namespace cv;
using namespace std;int main() {// 打开指定摄像头设备(仅打开一次)VideoCapture cap("/dev/video0");if (!cap.isOpened()) {cerr << "无法打开摄像头(路径:/dev/video0)" << endl;return -1;}// 关键:根据v4l2-ctl查询结果,设置支持的分辨率和像素格式// 示例:若支持MJPG格式的1920x1080,则先设置像素格式为MJPGcap.set(CAP_PROP_FOURCC, VideoWriter::fourcc('M', 'J', 'P', 'G')); // 设置为MJPEG格式// 设置分辨率(必须在支持的列表中,如1920x1080)bool setWidth = cap.set(CAP_PROP_FRAME_WIDTH, 1920);bool setHeight = cap.set(CAP_PROP_FRAME_HEIGHT, 1080);// 检查分辨率是否设置成功if (!setWidth || !setHeight) {cerr << "警告:摄像头不支持1920x1080分辨率,将使用默认分辨率" << endl;// 可选:自动降级为支持的分辨率(如1280x720,需确认是否在支持列表中)cap.set(CAP_PROP_FRAME_WIDTH, 1280);cap.set(CAP_PROP_FRAME_HEIGHT, 720);}// 增加短暂延迟,等待摄像头初始化完成(避免超时)this_thread::sleep_for(chrono::milliseconds(500));// 捕获一帧图像Mat frame;bool captureSuccess = cap.read(frame); // 推荐使用read()而非>>,更稳定if (!captureSuccess || frame.empty()) {cerr << "无法捕获图像(可能分辨率/格式不兼容)" << endl;cap.release();return -1;}// 保存图像string filename = "hbvcam_captured.jpg";bool saved = imwrite(filename, frame);if (saved) {cout << "图像已成功保存为: " << filename << endl;} else {cerr << "无法保存图像" << endl;return -1;}cap.release();return 0;
}
对c++代码进行编译
g++ usb_cam.cpp -o usb_cam `pkg-config --cflags --libs opencv4`
运行可执行程序
./usb_cam