opencv把一个图像copy到另一个图像中

把一个图片添加到另一个图片中

#include
#include
#include
using namespace std;
int main(int argc, char* argv[])
{
    IplImage* image = cvLoadImage("E:\\project\\images\\beauty.jpg");
    cvNamedWindow("image", CV_WINDOW_AUTOSIZE);

    //利用感兴趣区域实现图像覆盖
    IplImage *src = cvLoadImage("E:\\project\\images\\smallplane.png");
    cvNamedWindow("src", CV_WINDOW_AUTOSIZE);

    //选择感兴趣的区域
    CvRect rect;
    rect.x = 280;
    rect.y = 0;
    rect.height = src->height;
    rect.width = src->width;

    //与cvCopy和cvSetImageROI功能等价
    for (int i = 0; i < src->height; i++)
    {
        //所在行的首地址
        unsigned char* subImageData = (unsigned char*)src->imageData + i*src->widthStep;
        unsigned char* originalImageData = (unsigned char*)image->imageData + (i + rect.y)*image->widthStep;

        for (int j = 0; j < src->width; j++)
        {
            //由于是三通道的rgb图像,所以要对同一像素的R、G、B分别赋值,如果是灰色图像,可直接进行赋值
            originalImageData[3 * (j + rect.x) + 0] = subImageData[3 * j + 0];
            originalImageData[3 * (j + rect.x) + 1] = subImageData[3 * j + 1];
            originalImageData[3 * (j + rect.x) + 2] = subImageData[3 * j + 2];
        }
    }

    //与上面for循环功能一样
    //cvSetImageROI(image, rect);
    //cvCopy(src, image);
    //取消感兴趣区域,但是此时一把要添加的图片添加到另一图片中了
    //cvResetImageROI(image);

    cvShowImage("src", src);
    cvShowImage("image", image);
    cvWaitKey(0);
    return 0;
}

原图像与生成图像:
opencv把一个图像copy到另一个图像中_第1张图片这里写图片描述opencv把一个图像copy到另一个图像中_第2张图片

1、for循环是采用一个像素赋值一个像素的方法,里面有三条语句,主要是因为,IplImage结构中,也包含图像的depth属性,所以要对于RGB图像,要分别进行赋值。弱国没有分别进行赋值,仅使用如下语句:

originalImageData[(j + rect.x)] = subImageData[j];

则结果如下:
opencv把一个图像copy到另一个图像中_第3张图片

2、双重for循环的功能与下面的函数功能一样:

cvCopy(src, image);
cvSetImageROI(image, rect);
//取消感兴趣区域
cvResetImageROI(image);

3、也可以利用cvCopy从一幅图像中截取一部分添加到另一幅图像中。

你可能感兴趣的:(图像处理opencv)