当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/586386.html

相关文章:

  • The Black Heart
  • AOSP Settings模块问题初窥
  • day03-链表part1
  • C++类模版1
  • HTTP和HTTPS部分知识点
  • JAVA开发
  • 【数据结构初阶】--顺序表(三)
  • 广东省省考备考(第四十三天7.12)——数量(第四节课)
  • kettle从入门到精通 第101课 ETL之kettle DolphinScheduler调度kettle
  • 亚矩阵云手机:重构物流供应链,让跨境包裹“飞”得更快更准
  • 配置驱动开发:初探零代码构建嵌入式软件配置工具
  • ESP32使用freertos更新lvgl控件内容
  • TDengine 使用最佳实践(1)
  • Cell2location maps fine-grained cell types in spatial transcriptomics 文章解析
  • 全局唯一id生成
  • JavaScript加强篇——第七章 浏览器对象与存储要点
  • 深度学习-卷积化
  • 深入详解:决策树在医学影像领域心脏疾病诊断的应用及实现细节
  • Vue框架之钩子函数详解
  • ngrok使用
  • 企业商业秘密保卫战:经营信息类案件维权全攻略
  • 第三章第三节 GPIO 输入
  • Unity开发中常用的洗牌算法
  • 程序改错---字符串
  • 【离线数仓项目】——电商域DIM层开发实战
  • [特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案
  • Spring Boot 2.4+中bootstrap.yml加载顺序的源码深度解析
  • 北京高铁3h可达城市周末游攻略
  • 堆内存的详细结构以及java中内存溢出和排查方式
  • 大模型量化相关