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

时间:2014-12-05 16:49:55

标签: c++ image opencv filenames

每个人我只是引用了来自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(“rotating_im.png”,dst); cv :: imwrite(“rotating_im_%d.png”,i,dst);

它不起作用。

1 个答案:

答案 0 :(得分:5)

每次循环时都需要使用所需的文件名创建一个字符串,并将其传递给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。如果要按1计数,请使用整数,然后将其转换为double,如果需要将其用作double。由于您这样做(使用double angle = -i;),只需将for循环标题更改为:

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

这也会使你的输出文件名看起来更像我怀疑你想要它们。如果我是一个double,你可能会得到像rotate_im_5.000000.png这样的文件名。