У меня есть функция, которая принимает кадры камеры и регулирует их контрастность / яркость. Когда у меня есть…
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);
}
Вот что я знаю: конверсии успешны. Когда я снимаю изображение с камеры и запускаю его через ту же функцию, манипуляции с пикселями завершаются успешно — это особенно странно, поскольку обработка кадров и захваченных изображений идентична.
Что может быть не так?
Я вижу, что вы пытаетесь изменить яркость / контрастность кадра по пикселям.
Таким образом, вместо того, чтобы проходить через каждый пиксель из всех каналов кадра, вы можете сначала разделить каналы 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);
}
Вы также можете попробовать зациклить пиксели только в канале яркости.
Надеюсь это поможет!
Других решений пока нет …