一、错误描述
使用OpenCV程序打开usb摄像头时,发现其显示的视频内容并不在镜头的正中位置,而只是镜头左上角的一小块区域。
// OpenCV程序
#include <opencv2/opencv.hpp>
#include <string>
const std::string name = "Example2_10";
int main()
{
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
cap.open(0); //打开摄像头
if (!cap.isOpened()) //判断摄像头是打开成功
{
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}
cv::Mat frame;
for (;;) //显示摄像头拍摄内容
{
cap >> frame;
if (frame.empty())
break;
cv::imshow(name, frame);
if ((char)cv::waitKey(10) >= 0)
break;
}
cv::destroyAllWindows();
return 0;
}
显示的视频:
二、解决方法
如上的OpenCV程序是以默认方式打开摄像头,其显示的视频大小固定是640 x 480,但摄像头的分辨率是4608 x 3288,两者大小并不一致,从而造成显示的视频只占摄像头拍摄视频的一小部分。
640x480图片:
4608x3288图片:
640x480图片在4608x3288图片中的位置:(黑色矩形部分)
故应手动设置显示的视频大小为4608 x 3288,同时由于每一帧的图片过大无法在屏幕全部显示,还需缩小图片。
#include <opencv2/opencv.hpp>
#include <string>
const std::string name = "Example2_10";
const size_t width = 4608, height = 3288; // 相机分辨率
int main()
{
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
cap.open(0);
if (!cap.isOpened())
{
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}
// 设置相机分辨率
cap.set(cv::CAP_PROP_FRAME_WIDTH, width);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);
cv::Mat frame, image;
int w = width / 8, h = height / 8; // 缩小比例
for (;;)
{
cap >> frame;
if (frame.empty())
break;
cv::resize(frame, image, cv::Size(w, h)); // 缩小每一帧的图片
cv::imshow(name, image);
if ((char)cv::waitKey(10) >= 0)
break;
}
cv::destroyAllWindows();
return 0;
}
正确显示的视频: