分享

C++ 从一幅图片上裁取需要的区域

 猎狐肥 2019-09-29

1、Mat

  1. Mat src, image_src; //原图
  2. Mat imageROI; //ROI区域
  3. Mat TempImg; //裁取出的区域存储为Mat
  4. int x_begin, y_begin, width, height; //裁取区域的坐标及大小
  5. int srcWidth, srcHeight; //存储原图宽、高
  6. //赋初值
  7. x_begin = 0;
  8. y_begin = 0;
  9. width = 100;
  10. height = 100;
  11. //读取原图
  12. src = imread("test.jpg", 1);
  13. if(!src.data){
  14. cout<<" image read error!"<<endl;
  15. return -1;
  16. }
  17. srcWidth = src.cols; //获取原图宽、高
  18. srcHeight = src.rows;
  19. //控制裁取区域不超过原图
  20. if(width < 1 || height < 1 || width > srcWidth || height > srcHeight){
  21. LOOGE<<"[Rect error: srcWidth = "<<srcWidth<<", srcHeight = "<<srcHeight<<", x_begin = "
  22. <<x_begin<<", y_begin = "<<y_begin<<", width = "<<width<<", height = "<<height<<" ]";
  23. return -1;
  24. }
  25. if(x_begin + width > srcWidth)
  26. width = srcWidth - x_begin;
  27. if(y_begin + height > srcHeight)
  28. height = srcHeight - y_begin;
  29. 2、IplImage
    1. int x_begin, y_begin, width, height; //裁取区域的坐标及大小
    2. int srcWidth, srcHeight; //原图宽、高
    3. //赋初值
    4. x_begin = 0;
    5. y_begin = 0;
    6. width = 100;
    7. height = 100;
    8. //读取原图
    9. IplImage* src = cvLoadImage("test.jpg", 1);
    10. if(!src){
    11. cout<<" image read error!"<<endl;
    12. cvReleaseImage(&src);
    13. return -1;
    14. }
    15. srcWidth = image->width; //获取原图宽、高
    16. srcHeight = image->height;
    17. //控制裁取区域不超过原图
    18. if(width < 1 || height < 1 || width > srcWidth || height > srcHeight){
    19. LOOGE<<"[Rect error: srcWidth = "<<srcWidth<<", srcHeight = "<<srcHeight<<", x_begin = "
    20. <<x_begin<<", y_begin = "<<y_begin<<", width = "<<width<<", height = "<<height<<" ]";
    21. cvReleaseImage(&src);
    22. return -1;
    23. }
    24. if(x_begin + width > srcWidth)
    25. width = srcWidth - x_begin;
    26. if(y_begin + height > srcHeight)
    27. height = srcHeight - y_begin;
    28. //区域裁取
    29. IplImage* image_src = cvCloneImage(src); //备份原图
    30. cvSetImageROI(image_src, cvRect(x_begin, y_begin, width, height)); //设置待裁取ROI
    31. IplImage* dst = cvCreateImage(cvSize(width, height), src->depth, src->nChannels); //创建裁取区域大小的IplImage*
    32. cvCopy(image_src, dst); //将ROI区域拷贝至dst
    33. //释放资源
    34. cvReleaseImage(&src);
    35. cvResetImageROI(image_src);
    36. cvReleaseImage(&image_src);
    //区域裁取
  30. image_src = src.clone(); //备份原图
  31. imageROI = image_src(Rect(x_begin, y_begin, width, height)); //设置待裁取ROI
  32. imageROI.convertTo(TempImg, TempImg.type()); //将ROI区域拷贝至ds

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约