54 lines
1.5 KiB
C++
54 lines
1.5 KiB
C++
#include <opencv2/opencv.hpp>
|
||
#include <iostream>
|
||
|
||
int main() {
|
||
// 使用 V4L2 后端打开摄像头(设备索引 0 对应 /dev/video0)
|
||
cv::VideoCapture cap(0, cv::CAP_V4L2);
|
||
cap.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
|
||
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
|
||
cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('Y','U','Y','V'));
|
||
// cap.set(cv::CAP_PROP_BUFFERSIZE, 1); // 减少缓冲,降低延迟
|
||
|
||
if (!cap.isOpened()) {
|
||
std::cerr << "❌ 无法打开摄像头 /dev/video0\n";
|
||
return -1;
|
||
}
|
||
|
||
// 可选:设置分辨率和格式(根据你的摄像头能力调整)
|
||
|
||
|
||
std::cout << "✅ 摄像头已打开,按 'q' 或 ESC 退出。\n";
|
||
|
||
cv::Mat frame;
|
||
while (true) {
|
||
cap >> frame; // 从摄像头读取一帧
|
||
|
||
if (frame.empty()) {
|
||
std::cerr << "⚠️ 读取帧失败,可能摄像头被占用或断开。\n";
|
||
break;
|
||
}
|
||
|
||
// 如果是 YUYV 格式(2通道),转换为 BGR 显示彩色
|
||
cv::Mat display_frame;
|
||
if (frame.channels() == 2) {
|
||
cv::cvtColor(frame, display_frame, cv::COLOR_YUV2BGR_YUYV);
|
||
} else {
|
||
display_frame = frame; // 假设已经是 BGR
|
||
}
|
||
|
||
// 显示图像
|
||
cv::imshow("Camera Feed (V4L2)", display_frame);
|
||
|
||
// 按 q 或 ESC 退出
|
||
int key = cv::waitKey(1) & 0xFF;
|
||
if (key == 'q' || key == 27) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
cap.release();
|
||
cv::destroyAllWindows();
|
||
std::cout << "👋 已退出。\n";
|
||
return 0;
|
||
}
|