把一個圖片添加到另一個圖片中
#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從一幅圖像中截取一部分添加到另一幅圖像中。