如何在循环中以不同的名称保存 cv::imwrite

Posted

技术标签:

【中文标题】如何在循环中以不同的名称保存 cv::imwrite【英文标题】:How to save cv::imwrite in different name in the loop 【发布时间】:2014-12-05 16:49:54 【问题描述】:

我刚刚引用了来自Rotate an image without cropping in OpenCV in C++的旋转图像示例的每个人

#include "opencv2/opencv.hpp"

int main()

    cv::Mat src = cv::imread("im.png", CV_LOAD_IMAGE_UNCHANGED);
    double angle = -45;

    // get rotation matrix for rotating the image around its center
    cv::Point2f center(src.cols/2.0, src.rows/2.0);
    cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
    // determine bounding rectangle
    cv::Rect bbox = cv::RotatedRect(center,src.size(), angle).boundingRect();
    // adjust transformation matrix
    rot.at<double>(0,2) += bbox.width/2.0 - center.x;
    rot.at<double>(1,2) += bbox.height/2.0 - center.y;

    cv::Mat dst;
    cv::warpAffine(src, dst, rot, bbox.size());
    cv::imwrite("rotated_im.png", dst);

    return 0;

使用 opencv 2.4.9 (visual c++ 2010) 测试的代码

对我来说,我想让角度是可选的,这意味着我想将它从 0 更改为 360。 并将每张图片导入出来。 像这样:

#include "opencv2/opencv.hpp"

int main()
	for (double i=0;i<361;i++)

    cv::Mat src = cv::imread("refshape.bmp", CV_LOAD_IMAGE_UNCHANGED);
    double angle = -i;

    // get rotation matrix for rotating the image around its center
    cv::Point2f center(src.cols/2.0, src.rows/2.0);
    cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
    // determine bounding rectangle
    cv::Rect bbox = cv::RotatedRect(center,src.size(), angle).boundingRect();
    // adjust transformation matrix
    rot.at<double>(0,2) += bbox.width/2.0 - center.x;
    rot.at<double>(1,2) += bbox.height/2.0 - center.y;

    cv::Mat dst;
    cv::warpAffine(src, dst, rot, bbox.size());
    cv::imwrite("rotated_im.png", dst);

    return 0;

========================================== 改变角度很容易,但导入部分对我来说是挑战。 我想在我的文件中有 360 结果,我该怎么做? 我试图修改这一行:cv::imwrite("rotated_im.png", dst);cv::imwrite("rotated_im_%d.png", i , dst);

它不适合它。

【问题讨论】:

你的问题应该是“如何动态地将数字添加到字符串” imwrite(format(%d.png,i),img);一样使用cv::format() 请更好地格式化问题并删除运行代码的选项。 @Haris 不是%d.png,i,而是"%d.png,i"。还有一种更方便的使用方式是零填充imwrite(format("%05d.png, i), img); 【参考方案1】:

您需要在每次循环中使用所需文件名创建一个字符串,并将其传递给 cv::imwrite。在 C++ 中最简单的方法是使用 std::ostringstream。将循环体的最后一行(cv::imwrite)替换为:

std::ostringstream name;
name << "rotated_im_" << i << ".png";
cv::imwrite(name.str(), dst);

您需要在顶部添加#include &lt;sstream&gt; 以及其他包含。字符串流的工作方式与其他 iostream 一样(例如 std::cout 和 fstreams,如果您熟悉这些)。

另外,我不会在这样的 for 循环中使用 double。如果要按一计数,请使用整数,然后在需要将其用作双精度时将其转换为双精度。由于您正在这样做(使用double angle = -i;),只需将您的 for 循环头更改为:

for (int i =0; i <= 360; i++)

这也会使您的输出文件名看起来更像我怀疑您想要的。如果 i 是双精度数,您可能会得到像 rotate_im_5.000000.png 这样的文件名。

【讨论】:

我猜应该是 name.str().c_str() @Micka 仅在您需要 C 字符串 (const char*) 时。在这种情况下, cv::write 需要一个 std::string 作为文件名。 感谢@plasmoidia 的建议。有用。我将 double 修改为 int。 @HsuYu-WeiAuston 很高兴它对你有用。如果有帮助,您介意接受我的回答吗?

以上是关于如何在循环中以不同的名称保存 cv::imwrite的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中的每次迭代中保存具有不同名称的文件? MATLAB

在 for 循环中以 pdf 格式保存 2-plot 图形

在具有不同变量名称的循环中保存

在 for 循环中使用不同的名称保存模型预测

如何从不同的表中以最优化的方式获取国家、州、城市名称

在循环中以编程方式创建具有相同名称的 SKSpriteNodes 上使用 repeatActionForever?