У меня есть blendImage, frameImage (из JavaCameraView) и maskImage.Мне нужно смешать blendImage и frameImage, используя режим смешивания Lighten с альфа-каналом, рассчитанным из примененного maskImage.Для этого я предварительно умножаю значение затемненного frameImagePixel и сравниваю его.Однако ...
for (int i = 0; i < blendImage.rows; i++) {
uchar *blendImagePixel = blendImage.ptr(i);
uchar *frameImagePixel = frameImage.ptr(i);
uchar *maskImagePixel = maskImage.ptr(i);
int channelsToBlend = min(3, blendImage.channels()); //if it exists, never blend alpha channel
for (int j = 0; j != blendImage.cols * blendImage.channels(); j += blendImage.channels()) {
uchar adjustedMaskImagePixel = saturate_cast<uchar>( (maskImagePixel[j] * maskContrast) + maskBrightness);
for (int c = 0; c < channelsToBlend; c++) {
float alpha = (float) map(adjustedMaskImagePixel, 0, 255, 0, 1); //if black, alpha = 0
float beta = (float) 1.0 - alpha;
switch (blendMode) {
case LIGHTEN: {
/* THIS WORKS AND I DON'T KNOW WHY */
frameImagePixel[j + c] = (uchar) (frameImagePixel[j + c] * alpha);
if (blendImagePixel[j + c] > frameImagePixel[j + c])
frameImagePixel[j + c] = blendImagePixel[j + c];
/* THIS DOESN'T WORK AND I DON'T KNOW WHY
uchar darkenedFrameImagePixel = (uchar) (frameImagePixel[j + c] * alpha);
if (blendImagePixel[j + c] > darkenedFrameImagePixel )
frameImagePixel[j + c] = blendImagePixel[j + c];
*/
break;
}
}
}
}
}
Когда я вычисляю значение затемненного frameImagePixel и сохраняю его в самом frameImagePixel, окончательное изображение идеально.Тем не менее, когда я вычисляю значение затемненного frameImagePixel, но сохраняю его в uchar и сравниваю с переменной uchar, результат получается шумным с испорченными цветами - по большей части глючный беспорядок.Я не понимаюЭти две фразы кажутся эквивалентными.Почему один работает отлично, а другой ломается?