每个人我只是引用了来自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);
它不起作用。
答案 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这样的文件名。