OpenCV图像区域复制粘贴

转自http://blog.csdn.net/Augusdi/article/details/9012145

OpenCV把一个图像的一小块区域拷贝到另一个图像的指定区域,灰度图直接设定区域,复制粘贴即可:

[cpp]  view plain copy
  1. // vv.cpp : 定义控制台应用程序的入口点。  
  2. //opencv把一个图像的一小块区域拷贝到另一个图像的指定区域  
  3.   
  4. #include "stdafx.h"  
  5. #include "cv.h"  
  6. #include "highgui.h"  
  7.   
  8. int main()  
  9. {   
  10.     IplImage* img = cvLoadImage("c:\\lh.jpg",0);      
  11.     CvRect roi =cvRect(6, 6, 48, 48);   
  12.     cvNamedWindow("img");  
  13.     cvShowImage("img", img);  
  14.   
  15.     IplImage* img1 = cvLoadImage("c:\\leehom.jpg",0);     
  16.     CvRect roi1 = cvRect(6, 6, 48, 48);   
  17.     cvNamedWindow("img1");  
  18.     cvShowImage("img1", img1);  
  19.   
  20.     cvSetImageROI(img, roi);  
  21.     cvSetImageROI(img1, roi1);  
  22.     cvCopy(img1, img);  
  23.     cvResetImageROI(img);  
  24.     cvResetImageROI(img1);  
  25.   
  26.     cvNamedWindow("result");  
  27.   
  28.     cvShowImage("result", img);  
  29.       
  30.       
  31.   
  32.     cvWaitKey(-1);  
  33.     cvReleaseImage(&img);  
  34.     cvReleaseImage(&img1);  
  35.     cvDestroyAllWindows();  
  36.     return 0;  
  37. }  

结果图:



要注意

对于三通道图像:【拷贝的两幅图像的depth 和 nchanels 应该是一样的才可以哦】

额 其实代码一样的呃。 只是第一次随意指定的Rect区域,三通道图像不行,还看了下 cvSetImageROI的源码。

后来发现,额,三通道耶,rect区域的指定肯定是 3 的倍数撒!

特意设定相同的rect区域试了下,发现拷贝过去的图片是一样的耶。

好菜额···

不太懂,灰度图中是从第六个像素点开始的, 3通道图应该也是从第六个像素开始的啊,因为拷贝过去的图像是一样的啊。

如果3通道图中 的 6 也是指第六个像素的话,那,roi1 为嘛非要是3的倍数呢?

如果这个6指的是第3个像素的第一个通道位置的话,那么 为嘛拷贝过去的图像一样呢????

快哭了 额。。。暂时还没想通。。。。

[cpp]  view plain copy
  1. // vv.cpp : 定义控制台应用程序的入口点。  
  2. //opencv把一个图像的一小块区域拷贝到另一个图像的指定区域  
  3.   
  4. #include "stdafx.h"  
  5. #include "cv.h"  
  6. #include "highgui.h"  
  7.   
  8. int main()  
  9. {   
  10.     IplImage* img = cvLoadImage("c:\\lh.jpg",1);      
  11.     CvRect roi =cvRect(6, 6, 48, 48);   
  12.     cvNamedWindow("img");  
  13.     cvShowImage("img", img);  
  14.   
  15.     IplImage* img1 = cvLoadImage("c:\\leehom.jpg",1);     
  16.     CvRect roi1 = cvRect(6, 6, 48, 48);   
  17.     cvNamedWindow("img1");  
  18.     cvShowImage("img1", img1);  
  19.   
  20.     cvSetImageROI(img, roi);  
  21.     cvSetImageROI(img1, roi1);  
  22.     cvCopy(img1, img);  
  23.     cvResetImageROI(img);  
  24.     cvResetImageROI(img1);  
  25.   
  26.     cvNamedWindow("result");  
  27.     cvShowImage("result", img);  
  28.       
  29.       
  30.   
  31.     cvWaitKey(-1);  
  32.     cvReleaseImage(&img);  
  33.     cvReleaseImage(&img1);  
  34.     cvDestroyAllWindows();  
  35.     return 0;  
  36. }  




opencv中cvSetImageROI在 cvcore.h中,具体在 cxarray.cpp 中:

[cpp]  view plain copy
  1. CV_IMPL void  
  2. cvSetImageROI( IplImage* image, CvRect rect )  
  3. {  
  4.     if( !image )  
  5.         CV_Error( CV_HeaderIsNull, "" );  
  6.   
  7.     // allow zero ROI width or height  
  8.     CV_Assert( rect.width >= 0 && rect.height >= 0 &&  
  9.                rect.x < image->width && rect.y < image->height &&  
  10.                rect.x + rect.width >= (int)(rect.width > 0) &&  
  11.                rect.y + rect.height >= (int)(rect.height > 0) );  
  12.       
  13.     rect.width += rect.x;  
  14.     rect.height += rect.y;  
  15.       
  16.     rect.x = std::max(rect.x, 0);  
  17.     rect.y = std::max(rect.y, 0);  
  18.     rect.width = std::min(rect.width, image->width);  
  19.     rect.height = std::min(rect.height, image->height);  
  20.       
  21.     rect.width -= rect.x;  
  22.     rect.height -= rect.y;  
  23.   
  24.     if( image->roi )  
  25.     {  
  26.         image->roi->xOffset = rect.x;  
  27.         image->roi->yOffset = rect.y;  
  28.         image->roi->width = rect.width;  
  29.         image->roi->height = rect.height;  
  30.     }  
  31.     else  
  32.         image->roi = icvCreateROI( 0, rect.x, rect.y, rect.width, rect.height );  
  33. }  

后面我使用的时候,发现一个很奇怪的现象,不知道是不是我使用的 opencv2.3.1 版本的问题

ex:

[cpp]  view plain copy
  1. //人脸区域  
  2. CvRect roi = cvRect(r_ret->x * scale, r_ret->y * scale, r_ret->width * scale, r_ret->height * scale );  
  3. cvRectangle(img, cvPoint(roi.x , roi.y ), cvPoint( roi.x + roi.width , roi.y + roi.height), CV_RGB(0, 255, 0), 3, 8, 0);   
  4. cvSetImageROI(img, roi);  
  5. //裁剪出人脸图像,灰度图  
  6. IplImage* face = cvCreateImage( cvSize(roi.width, roi.height), 8, 1);  
  7. cvCopy(img, face);  
  8. cvResetImageROI(img);  

这样是没问题的、但是下面这样,就有问题了:

[cpp]  view plain copy
  1. //人脸区域  
  2. CvRect roi = cvRect(r_ret->x * scale, r_ret->y * scale, r_ret->width * scale, r_ret->height * scale );  
  3. cvRectangle(img, cvPoint(roi.x , roi.y ), cvPoint( roi.x + roi.width , roi.y + roi.height), CV_RGB(0, 255, 0), 3, 8, 0);   
  4. //裁剪出人脸图像,灰度图  
  5. IplImage* face = cvCreateImage( cvSize(roi.width, roi.height), 8, 1);  
  6.   
  7. cvSetImageROI(img, roi);  
  8. cvCopy(img, face);  
  9. cvResetImageROI(img);  

真是奇了怪了, roi区域 又不会改变。。。。。。。。。。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值