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

Hsu*_*ton 3 c++ filenames opencv image

每个人我只是引用了一个旋转图像样本:旋转图像而不用C++中的OpenCV中的裁剪

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

它不起作用.

pla*_*dia 5

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

std::ostringstream name;
name << "rotated_im_" << i << ".png";
cv::imwrite(name.str(), dst);
Run Code Online (Sandbox Code Playgroud)

您需要#include <sstream>在顶部添加其他包含.字符串流的工作方式与其他iostream类似(例如std :: cout和fstreams,如果你熟悉那些).

另外,我不会在for循环中使用double.如果要按1计数,请使用整数,然后将其转换为double,如果需要将其用作double.既然你正在这样做(有double angle = -i;),只需将你的for循环标题更改为:

for (int i =0; i <= 360; i++)
Run Code Online (Sandbox Code Playgroud)

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