如何在循环中以不同的名称保存 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 <sstream>
以及其他包含。字符串流的工作方式与其他 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的主要内容,如果未能解决你的问题,请参考以下文章