当前位置: 首页 > 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.xdnf.cn/news/1110727.html

相关文章:

  • kettle从入门到精通 第101课 ETL之kettle DolphinScheduler调度kettle
  • 怎么在ComfyUI中查看别人训练的lora模型训练参数
  • 面试150 翻转二叉树
  • 26-计组-寻址方式
  • Git企业级开发(最终篇)
  • 手把手教你用YOLOv10打造智能垃圾检测系统
  • SpringBootloggers未授权访问漏洞处理
  • Java使用Langchai4j接入AI大模型的简单使用(四)--整合Springboot
  • 12.使用VGG网络进行Fashion-Mnist分类
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • CSS flex
  • 安卓定制功能
  • 外设数据到昇腾310推理卡 之二dma_alloc_attrs
  • Linux系统编程——目录 IO
  • 理解小数的计算机表达
  • PyTorch神经网络实战:从零构建图像分类模型
  • 脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章
  • 复现永恒之蓝
  • Linux - 安全排查 3
  • 飞算JavaAI:重新定义Java开发效率的智能引擎
  • python-for循环
  • 【TA/Unity】Shader基础结构
  • 强化学习、PPO和GRPO的通俗讲解
  • 创客匠人:解析创始人 IP 打造对知识变现的深层赋能
  • os.machine()详解
  • vue3 el-table动态表头
  • 菜鸟的C#学习(二)
  • TDengine 使用最佳实践(1)
  • hot100链表(1)
  • 工业软件出海的ERP-PLM-MES一体化解决方案