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);
它不起作用.
每次循环时都需要使用所需的文件名创建一个字符串,并将其传递给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这样的文件名.