学习OpenCV3:视频不在镜头中央,且只显示镜头的部分内容?


一、错误描述

  使用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图片:

640x480图片

4608x3288图片:

4608x3288图片

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;
}

正确显示的视频:

正确显示的视频

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值