opencv将图片分成多个256*256像素的小图片

来源:互联网 发布:淘宝买家秀链接在哪里 编辑:程序博客网 时间:2024/06/05 14:25

作者:恋上蛋炒面

转自:http://blog.csdn.net/skeeee/article/details/8864481


想将一张大图片分成256*256像素的多个小图片,网上搜了很多资料,知道opencv的API中没有这样的函数,只能自己实现。

实现程序环境:

opencv版本:opencv2.4.4

编译环境:vs2010

操作系统:xp

我的实现方法有4步:

          1)将图片转化为长宽都是2的幂次的图片,使用resize函数。(根据本文的图片素材,转化成4096*2048像素)

[cpp] view plaincopy
  1. cv::resize(img,result,cv::Size(4096,2048));  

2)用for循环,从坐上角依次选取256*256的矩形ROI(感兴趣区域) 

3)将选取的ROI复制到临时tempimage中,添加到vector<cv::Mat>中

[cpp] view plaincopy
  1. int m,n;  
  2.     m = image.rows/height;  
  3.     n = image.cols/width;  
  4.     vector<cv::Mat> imgOut;  
  5.     for (int j = 0;j<m;j++)  
  6.     {  
  7.         for(int i = 0;i<n;i++)  
  8.         {  
  9.             cv::Mat temImage(height,width,CV_8UC3,cv::Scalar(0,0,0));//mat(rows,cols,)   
  10.             cv::Mat imageROI = image(cv::Rect(i*width,j*height,temImage.cols,temImage.rows));//rect(x, y, width, height)选定感兴趣区域  
  11.             cv::addWeighted(temImage,1.0,imageROI,1.0,0.,temImage);//复制扫描出的边界内数据  
  12.             imgOut.push_back(temImage);  
  13.         }  
  14.     }  


4)最后将vector<cv::Mat>中的图片按顺序写入到jpg中
[plain] view plaincopy
  1. <span style="white-space:pre">  </span>vector<cv::Mat>::iterator it = imgDiv.begin();  
  2.     while(it!=imgDiv.end())  
  3.     {  
  4.         cv::imwrite(imagename,*it);  
  5.         if ((++imagename[2]) == 58)  
  6.         {  
  7.             imagename[2] = '0';  
  8.             if ((++imagename[1])==58)  
  9.             {  
  10.                 imagename[1] = '0';  
  11.                 imagename[0]++;  
  12.             }   
  13.         }  
  14.         it++;  
  15.     }  
程序代码:

astido.h

[cpp] view plaincopy
  1. #include <opencv2/highgui/highgui.hpp>  
  2. #include <opencv2/core/core.hpp>  
  3. #include <opencv2/imgproc/imgproc.hpp>  
  4. #include <iostream>  
  5. #include <string>  
  6.   
  7. using namespace cv;  
  8. using namespace std;  
  9.   
  10. #define  Dst_img_width 256  
  11. #define  Dst_img_height 256  
     division.h
[cpp] view plaincopy
  1. #include "astdio.h"  
  2. #include <vector>  
  3.   
  4. vector<cv::Mat>  division(cv::Mat &image,int width,int height);  

division.cpp
[cpp] view plaincopy
  1. #include "division.h"  
  2.   
  3. vector<cv::Mat>  division(cv::Mat &image,int width,int height)  
  4. {  
  5.     char name = 1;  
  6.     int m,n;  
  7.     m = image.rows/height;  
  8.     n = image.cols/width;  
  9.     vector<cv::Mat> imgOut;  
  10.     for (int j = 0;j<m;j++)  
  11.     {  
  12.         for(int i = 0;i<n;i++)  
  13.         {  
  14.             cv::Mat temImage(height,width,CV_8UC3,cv::Scalar(0,0,0));//mat(rows,cols,)   
  15.             cv::Mat imageROI = image(cv::Rect(i*width,j*height,temImage.cols,temImage.rows));//rect(x, y, width, height)选定感兴趣区域  
  16.             cv::addWeighted(temImage,1.0,imageROI,1.0,0.,temImage);//复制扫描出的边界内数据  
  17.             imgOut.push_back(temImage);  
  18.         }  
  19.     }  
  20.     return imgOut;  
  21. }  

main.cpp
[cpp] view plaincopy
  1. #include "astdio.h"  
  2. #include "division.h"  
  3.   
  4. int main()  
  5. {  
  6.     string imagename = "000.jpg";  
  7.     cv::Mat img = cv::imread("image.jpg");  
  8.     if (!img.data)  
  9.     {  
  10.         cout<<"can't open img.jpg"<<endl;  
  11.         return -1;  
  12.     }  
  13.     cout<<"size of original.jpg is "<<img.cols<<"*"<<img.rows;  
  14.     cv::Mat result;  
  15.     cv::resize(img,result,cv::Size(4096,2048));  
  16.     cv::imwrite("result.jpg",result);  
  17.     vector<cv::Mat> imgDiv;  
  18.     imgDiv = division(result,Dst_img_width,Dst_img_height);  
  19.     vector<cv::Mat>::iterator it = imgDiv.begin();  
  20.     while(it!=imgDiv.end())  
  21.     {  
  22.   
  23.         cv::imwrite(imagename,*it);  
  24.         if ((++imagename[2]) == 58)  
  25.         {  
  26.             imagename[2] = '0';  
  27.             if ((++imagename[1])==58)  
  28.             {  
  29.                 imagename[1] = '0';  
  30.                 imagename[0]++;  
  31.             }  
  32.                
  33.         }  
  34.         it++;  
  35.     }  
  36. }  

源程序下载:

http://download.csdn.net/detail/skeeee/5322934

0 0
原创粉丝点击