OpenCv, Android: невозможно редактировать пиксели кадра камеры, преобразованного в цветовое пространство HLS

У меня есть функция, которая принимает кадры камеры и регулирует их контрастность / яркость. Когда у меня есть…

void applyContrastBrightnessToFrame(Mat &frame, float contrast, int brightness)
{
for (int i = 0; i < frame.rows; i++) {
uchar *basePixel = frame.ptr(i);
for (int j = 0; j != frame.cols * frame.channels(); j += frame.channels()) {
int channelsToBlend = min(3, frame.channels()); //never adjust alpha channel
for (int c = 0; c < channelsToBlend; c++) {
basePixel[j + c] = saturate_cast<uchar>(basePixel[j + c] * contrast + brightness);
}
}
}
}

Работает отлично.

Но когда я конвертирую изображение в HLS, чтобы я мог выполнить эти настройки, не нарушая насыщенность, манипуляции с пикселями не удаются …

void applyContrastBrightnessToFrame(Mat &frame, float contrast, int brightness)
{
cvtColor(frame, frame, CV_RGBA2RGB);
cvtColor(frame, frame, CV_RGB2HLS);
assert(frame.channels() == 3);for (int i = 0; i < frame.rows; i++) {
uchar *basePixel = frame.ptr(i);
for (int j = 0; j != frame.cols * frame.channels(); j += frame.channels()) {
int lumaChannel = 1;
//all pixel manipulations fail....
basePixel[j + lumaChannel] = 0;  //setting to a constant
saturate_cast<uchar>(basePixel[j + lumaChannel] + brightness); //adjusting
}
}

cvtColor(frame, frame, CV_HLS2RGB);
cvtColor(frame, frame, CV_BGR2RGBA);
assert(frame.channels() == 4);
}

Вот что я знаю: конверсии успешны. Когда я снимаю изображение с камеры и запускаю его через ту же функцию, манипуляции с пикселями завершаются успешно — это особенно странно, поскольку обработка кадров и захваченных изображений идентична.

Что может быть не так?

0

Решение

Я вижу, что вы пытаетесь изменить яркость / контрастность кадра по пикселям.

Таким образом, вместо того, чтобы проходить через каждый пиксель из всех каналов кадра, вы можете сначала разделить каналы HLS, выполнить операции и объединить их обратно.

void applyContrastBrightnessToFrame(Mat &frame, float contrast, int
brightness)
{
cvtColor(frame, frame, CV_RGBA2RGB);
cvtColor(frame, frame, CV_RGB2HLS);
vector<Mat> hlsChannels(3);
split(frame, hlsChannels);
hlsChannels[1] += brightness; //adding brightness to channel 2(lightness channel)
merge(hlschannels, frame);
cvtColor(frame, frame, CV_HLS2RGB);
cvtColor(frame, frame, CV_BGR2RGBA);
}

Вы также можете попробовать зациклить пиксели только в канале яркости.

Надеюсь это поможет!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]