opencv把一個圖像copy到另一個圖像中

把一個圖片添加到另一個圖片中

#include<highgui.h>
#include<stdio.h>
#include<stdlib.h>
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;
}

原圖像與生成圖像:
這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述

1、for循環是採用一個像素賦值一個像素的方法,裏面有三條語句,主要是因爲,IplImage結構中,也包含圖像的depth屬性,所以要對於RGB圖像,要分別進行賦值。弱國沒有分別進行賦值,僅使用如下語句:

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

則結果如下:
這裏寫圖片描述

2、雙重for循環的功能與下面的函數功能一樣:

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

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

發佈了41 篇原創文章 · 獲贊 35 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章