【问题标题】:OpenCV : How to resize a capture?OpenCV:如何调整捕获的大小?
【发布时间】:2017-11-03 17:06:24
【问题描述】:

我试图以完全相同的大小显示捕获。我试过这个:

// in the class.h
cv::Mat frame;
cv::VideoCapture capture;

我现在尝试了几种解决方案:

// Number 1: The size doesn't change at all.
this->capture.open(0);
or
this->capture.open(filename);

this->capture.set(CV_CAP_PROP_FRAME_WIDTH, 800);
this->capture.set(CV_CAP_PROP_FRAME_HEIGHT, 600);

-

// Number 2: Exception
this->capture.open(0);
or
this->capture.open(filename);

this->capture.read(this->frame);
if (!this->frame.empty())
    cv::resize(this->frame, this->frame, cv::Size(800, 600));

-

// Number 3: Exception
this->capture.open(0);
or
this->capture.open(filename);

cv::resize(this->frame, this->frame, cv::Size(800, 600));
this->capture.read(this->frame);

这些都不起作用。知道如何正确调整它的大小吗?

【问题讨论】:

  • 什么不起作用?你有其他尺寸的视频吗?我认为更多代码会有所帮助。
  • 我看不出它需要更多代码。它不起作用,因为视频没有调整大小、网络摄像头或文件。
  • OP 用测试编辑。
  • // Number 3: Exception 是否意味着您遇到了异常?如果是这样的话。在 3 中,在阅读之前调整框架大小没有任何意义。我同意 a-Jays 关于代码的观点 - 很难了解上下文。
  • 是的,对于 2 也是,这意味着我遇到了异常。我不明白为什么你需要上下文,因为代码是非常自我解释的。但我想,有些人只是想投反对票。

标签: c++ opencv


【解决方案1】:

对于函数capture.set(),只有一些选项适用于某些输入格式。这意味着例如您不能为电影文件设置 FPS,但您可以跳到某个帧。另一方面,在相机输入上,您可以完全相反。

因此,如果您在加载影片时尝试更改输入图像的大小,则必须使用cv::resize()。如果您正在加载相机输入,则可能是相机不支持此分辨率。看看您是否可以使用其他程序从该相机获取此尺寸的图像。

您可以通过以下方式使用cv::resize()

this->capture.open(0);
if(this->campture.isOpen()){
 this->capture.read(this->frame);
 if (!this->frame.empty()){
  cv::Mat resized;
  cv::resize(this->frame, resized, cv::Size(800, 600));
  cv::imshow("resized",resized);
 } else std::cout<<"No input frame!"<<std::endl;
 cv::waitKey(5);
} else std::cout<<"No camera detected!"<<std::endl;

【讨论】:

  • 当然需要 cv::waitKey() 才能真正看到任何东西。
  • 确实,我已经编辑了帖子以包含 waitKey()
  • 我更新了 OP,在那里我测试了您的解决方案。它不起作用。
  • 我在 OP 中看不到那部分。你的错误信息到底是什么?您显示的图片是否正确?
  • 你的将是 // 2 号,我遇到了一个异常,我将其隔离到 cv::resize() 部分。你可能想说这不是你写的,但我确实写得和你一样。还是一样。
【解决方案2】:

我不认为您可以调整捕获的大小,或者至少不能像您尝试过的那样。 set 功能是设置属性(宽度、高度等)不调整大小。

我建议您获取框架并调整每个框架的大小:

while (true)
{
  cv::Mat frame;
  this->capture >> frame;
  if (frame.empty()) break;
  cv::resize(frame, frame, sizeYouWant);
  // ...
}

【讨论】:

  • 好的,这种方式不调整捕获的大小,只调整帧。也许您应该根据调整大小的帧创建另一个捕获? &gt;&gt; 表示读取...
  • 如何根据帧大小进行捕获?
【解决方案3】:
frame = cv2.resize(old_frame, None, fx=0.4, fy=0.4, interpolation=cv2.INTER_LINEAR)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多