C++ opencv 将图片分为任意N等分,并保存所有子图片于本地

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;
}
}


猜你喜欢

转载自blog.csdn.net/m0_37844017/article/details/80474496