4k カメラを持っています。解像度を 4k に設定すると、フレーム レートが常に不足します。
コマンドを使用して確認します。
v4l2-ctl --device=/dev/video0 --list-formats-ext
発見する
v4l2-ctl --device=/dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 3840x2160
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 2592x1944
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 2688x1512
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 2048x1536
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1600x1200
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 960x540
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 640x360
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x1280
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 3840x2160
Interval: Discrete 1.000s (1.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 2592x1944
Interval: Discrete 0.500s (2.000 fps)
Size: Discrete 2688x1512
Interval: Discrete 0.500s (2.000 fps)
Size: Discrete 2048x1536
Interval: Discrete 0.333s (3.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1600x1200
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.133s (7.500 fps)
Size: Discrete 1280x720
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 960x540
Interval: Discrete 0.050s (20.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.050s (20.000 fps)
Size: Discrete 640x360
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x1280
Interval: Discrete 0.200s (5.000 fps)
したがって、ビデオキャプチャ形式をMJPGに設定する必要があります
C++ opencv でビデオ キャプチャ形式を MJPG に設定する
エラーは次のように報告されます。
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1186) setProperty OpenCV | GStreamer warning: GStreamer: unhandled property
[ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1036) getProperty OpenCV | GStreamer warning: unhandled property: 6
これらの警告は、V4L2 (Video4Linux2) バックエンドの代わりに GStreamer バックエンドを使用することによって発生する可能性があります。一部のシステムでは、OpenCV はデフォルトでビデオ キャプチャに GStreamer を使用します。
C++ の V4L2 バックエンドを使用してビデオ キャプチャ形式を MJPG に設定するには、次のコードを使用してみてください。
#include <opencv2/opencv.hpp>
int main()
{
// 打开视频捕获设备
cv::VideoCapture cap(0, cv::CAP_V4L2);
// 设置视频捕获格式为 MJPG
cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
// 检查是否成功设置格式
int fourcc = cap.get(cv::CAP_PROP_FOURCC);
if (fourcc == cv::VideoWriter::fourcc('M', 'J', 'P', 'G'))
{
std::cout << "视频捕获格式已成功设置为 MJPG" << std::endl;
}
else
{
std::cout << "视频捕获格式设置失败" << std::endl;
}
// 释放视频捕获设备
cap.release();
return 0;
}
上記のコードでは、cv::CAP_V4L2 を 2 番目のパラメーターとして cv::VideoCapture コンストラクターに渡すことにより、V4L2 バックエンドを明示的に使用します。これにより、デフォルトの GStreamer バックエンドではなく、V4L2 バックエンドがビデオ キャプチャに使用されるようになります。
V4L2 バックエンドが利用できるかどうかは、システムとインストールされている OpenCV のバージョンによって異なることに注意してください。システムが V4L2 バックエンドをサポートしていない場合、FourCC をセットアップしてもビデオ キャプチャ形式を変更できない場合があります。
以下は設定(ビデオキャプチャ)です ioctl:VIDIOC_ENUM_FMT タイプ:MJPG
フレームレートと解像度を設定し、ビデオのコードを表示します
/*****************************************************
2023.8.5: test_opencv.cpp
******************************************************/
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
int main()
{
// 测试视频
// VideoCapture cap;
cv::VideoCapture cap(0, cv::CAP_V4L2);
if (!cap.isOpened())
{
printf("camera 打开失败\n");
}
else
{
printf("camera 打开 ok\n");
}
// 设置视频捕获格式为 MJPG
cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
// 检查是否成功设置格式
int fourcc = cap.get(cv::CAP_PROP_FOURCC);
if (fourcc == cv::VideoWriter::fourcc('M', 'J', 'P', 'G'))
{
std::cout << "视频捕获格式已成功设置为 MJPG" << std::endl;
}
else
{
std::cout << "视频捕获格式设置失败" << std::endl;
}
// 设置视频分辨率
int width = 3840;
int height = 2160;
cap.set(cv::CAP_PROP_FRAME_WIDTH, width);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);
// 设置视频帧率
double frameRate = 30.0;
cap.set(cv::CAP_PROP_FPS, frameRate);
// 检查是否成功设置分辨率和帧率
int setWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int setHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
double setFrameRate = cap.get(cv::CAP_PROP_FPS);
if (setWidth == width && setHeight == height && setFrameRate == frameRate)
{
std::cout << "视频分辨率和帧率已成功设置" << std::endl;
printf("width=%d\n", frameWidth);
printf("height=%d\n", frameHeight);
printf("width=%d\n", frameWidth);
}
else
{
std::cout << "视频分辨率和帧率设置失败" << std::endl;
}
Mat frame;
while (true)
{
cap >> frame;
if (frame.data == NULL)
{
printf("Image is empty\n");
break;
}
namedWindow("111", 0); // 参数为零,则可以自由拖动
imshow("111", frame);
waitKey(1);
}
return 0;
}