【发布时间】:2015-02-28 12:54:31
【问题描述】:
我写了一个小函数,以便能够将图像的像素“粘贴”在另一个图像之上,但不知何故它不起作用:虽然我的“粘贴”图像的“形状”是正确的,但颜色是不是。
示例花是第一张图片,作为第二张图片,我有一个黑色梯形 png。如您所见,存在多个问题: 1.颜色显示怪异。实际上没有颜色,只有灰度,还有一些奇怪的条纹作为叠加。 2. 不尊重 Alpha 值。叠加图像的白色部分在 png 中是透明的。
这是我的代码:
void mergeMats(Mat mat1, Mat mat2, int x, int y){
//unsigned char * pixelPtr = (unsigned char *)mat2.data;
//unsigned char * pixelPtr2 = (unsigned char *)mat1.data;
//int cn = mat2.channels();
//int cn2 = mat2.channels();
//Scalar_<unsigned char> bgrPixel;
for (int i = 0; i < mat2.cols; i++){
for (int j = 0; j < mat2.rows; j++){
if (x + i < mat1.cols && y + j < mat1.rows){
Vec3b &intensity = mat1.at<Vec3b>(j+y, i+x);
Vec3b intensity2 = mat2.at<Vec3b>(j, i);
for (int k = 0; k < mat1.channels(); k++) {
intensity.val[k] = saturate_cast<uchar>(intensity2.val[k]);
}
//pixelPtr2[(i + x)*mat1.cols*cn2 + (j + y)*cn2 + 0] = pixelPtr[(i + x)*mat2.cols*cn + (j + y)*cn + 0];
//pixelPtr2[(i + x)*mat1.cols*cn2 + (j + y)*cn2 + 1] = pixelPtr[(i + x)*mat2.cols*cn + (j + y)*cn + 1];
//pixelPtr2[(i + x)*mat1.cols*cn2 + (j + y)*cn2 + 2] = pixelPtr[(i + x)*mat2.cols*cn + (j + y)*cn + 2];
}
}
}
}
注释代码是另一种方法,但结果相同。 所以,这是我的问题: 1. 如何解决这 2 个问题(1. 颜色...,2. alpha ...) 2. 任何 Mat-Object 的像素阵列实际上是如何组织的?我想如果我知道其中的内容,我会更容易操作这些数组。
【问题讨论】:
标签: c++ arrays image opencv mat