我有一个接收相机帧并对其进行对比度/亮度调整的功能。我什么时候......
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 :(得分:1)
我可以看到你试图以像素为单位改变帧的亮度/对比度。
因此,您可以先拆分HLS通道,执行操作并将它们合并,而不是遍历帧的所有通道中的每个像素。
C1,C2
Data,Data
您也可以尝试仅在亮度通道中对像素进行循环。
希望这有帮助!