C++ opencv 将图片分为任意N等分,并保存所有子图片于本地(第一次写博客,格式不对之处,请原谅)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int cnt = 1;
int num = 1;
char temp_file[5];
string filename;
string path;
int main()
{
vector<Mat> subImages; //等分后的各子图
int subImageNum = 4; // 给原图分16块
Mat src;
//Mat subImages;
printf("1111\n");
//std::cout<<subImages[0]<<std::endl;
printf("111\n");
src = imread("/home/swl/Desktop/use/000003.jpg",-1);
/*
第一个参数是图片的绝对地址
第二个参数表示图片读入的方式(flags可以缺省,缺省时flags=1,表示以彩色图片方式读入图片)
flags>0时表示以彩色方式读入图片
flags=0时表示以灰度图方式读入图片
flags<0时表示以图片的本来的格式读入图片
*/
imshow("123", src); //“123”是显示框的 名字
waitKey(0);
destroyAllWindows();
//std::cout<<src<<std::endl;
printf("11\n");
/*
if(!src.data){
cout<<"source image error! [subImageExtract()]"<<endl;
return -1;
}
*/
subImages.clear();
printf("1\n");
//cout<< subImages<<endl;
//printf("");
////////得到原图的宽高
int srcHeight, srcWidth, subHeight, subWidth;
srcHeight = src.rows; ////获取原图宽、高
srcWidth = src.cols;
subHeight = srcHeight / subImageNum;
subWidth = srcWidth / subImageNum;
//std::cout<<subImages[0]<<std::endl;
printf("22\n");
////////给原图分块
for(int j = 0; j < subImageNum; j++)
{ for(int i = 0; i < subImageNum; i++)
{
if(j < subImageNum - 1 && i < subImageNum - 1){
cv::Mat temImage(subHeight, subWidth, CV_8UC3, cv::Scalar(0,0,0));
cv::Mat imageROI = src(cv::Rect(i * subWidth, j * subHeight, temImage.cols, temImage.rows));
cv::addWeighted(temImage, 1.0, imageROI, 1.0, 0., temImage);
subImages.push_back(temImage);
}else{
cv::Mat temImage(srcHeight - (subImageNum - 1) * subHeight, srcWidth - (subImageNum - 1) * subWidth, CV_8UC3, cv::Scalar(0,0,0));
cv::Mat imageROI = src(cv::Rect(i * subWidth, j * subHeight, temImage.cols, temImage.rows));
cv::addWeighted(temImage, 1.0, imageROI, 1.0, 0., temImage);
subImages.push_back(temImage);
}
}
std::cout<<subImages[0]<<std::endl; //测试语句,打印出子图矩阵
printf("33\n");
///////将子图保存下来
int n = 0;
vector<Mat>::iterator it = subImages.begin();
while (it != subImages.end())
{
Mat tmp = *it;
stringstream ss;
ss << n;
n++;
imwrite(ss.str() + ".jpg", tmp);
//imshow("/home/swl/Desktop/use/mseg/", tmp);
it++;
waitKey(10);
}
printf("44\n");
return 0;
}
}