OpenCv,Android:无法编辑转换为 HLS 颜色空间的相机帧像素

Posted

技术标签:

【中文标题】OpenCv,Android:无法编辑转换为 HLS 颜色空间的相机帧像素【英文标题】:OpenCv, Android: cannot edit pixels of camera frame converted to HLS colorspace 【发布时间】:2018-01-25 00:32:16 【问题描述】:

我有一个功能可以接收相机帧并对它们进行对比度/亮度调整。当我有...

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);

这是我所知道的:转换是成功的。当我从相机捕获图像并通过相同的功能运行它时,像素操作成功 - 这尤其奇怪,因为帧和捕获的图像的处理是相同的。

可能出了什么问题?

【问题讨论】:

【参考方案1】:

我可以看到您正在尝试以像素为单位更改帧的亮度/对比度。

因此,您可以先拆分 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);

您也可以尝试仅循环遍历亮度通道中的像素。

希望这会有所帮助!

【讨论】:

以上是关于OpenCv,Android:无法编辑转换为 HLS 颜色空间的相机帧像素的主要内容,如果未能解决你的问题,请参考以下文章

使用 JAVA 将 HL7 转换为 JSON

Android Studio + opencv开发配置

android:如何将 int[] 转换为 OpenCV Mat c++?

将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat

HL7 转换为XML的事例

使用 OpenCV 从 android Camera2 将 YUV 转换为 RGB ImageReader 时出现问题,输出图像为灰度