OpenCv,Android:无法编辑转换为HLS色彩空间的相机帧像素
OpenCv, Android: cannot edit pixels of camera frame converted to HLS colorspace
我有一个函数,可以接收相机帧并对其进行对比度/亮度调整。当我有...
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);
}
您也可以尝试单独循环访问亮度通道中的像素。
希望这有帮助!
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- OpenCv,Android:无法编辑转换为HLS色彩空间的相机帧像素
- 生成用于sRGB到CIELAB色彩空间转换的3DLUT(.3dl文件)
- OpenCV和使用的色彩空间
- 在色彩空间之间转换图像
- Direct3D11包含色彩空间转换吗?
- 寻找相似颜色的最佳色彩空间