Android OpenCV convertTo()从CV_32FC4到CV_8UC4

时间:2017-11-08 15:26:42

标签: android c++ opencv android-ndk

我刚认识Android& OpenCV,目前我正在使用this项目进行实时图像处理。我正在使用项目中的native code cpp来实现我需要的算法,该算法涉及使用浮点数进行数学运算,对每个像素应用RGB通道的修改。因此,我认为将 CV_32FC4 用于第一个矩阵是恰当的。我在cpp中做的调整:

Mat mFrame(height, width, CV_32FC4, (unsigned char *)pNV21FrameData);
Mat mResult(height, width, CV_8UC4, (unsigned char *)poutPixels);

for(int y = 0 ; y < height ; y++){
    for(int x = 0 ; x < width ; x++){
        Vec3b BGR = mFrame.at<Vec3b>(Point(x,y));
        // BGR Pixel Manipulations
        mFrame.at<Vec3b>(Point(x,y)) =  BGR;
    }
}

mFrame.convertTo(mResult, CV_8UC4, 1/255.0);

在实施算法后,我需要将矩阵转换为BGRA,因为这是要求所以我使用 CV_8UC4 。但是当我运行该程序时,显示器出现问题:link for actual image

Output Image

右侧的白色物体似乎是显示的破坏版本的多个实例。原始代码是Canny Edge Detection,所以我认为这不是我的设备的问题。可能是什么问题?

1 个答案:

答案 0 :(得分:1)

  • 您正在使用4通道浮点矩阵,因此您应该使用Vec4f访问它。
  • 您通常不需要从OpenCV函数初始化输出矩阵。因此,只需使用Mat mResult;cvtColor即可正确创建它。
  • 您无需使用Point访问像素,只需传递行和列坐标。

所以代码变成:

Mat mFrame(height, width, CV_32FC4, (unsigned char *)pNV21FrameData);

for(int y = 0 ; y < height ; y++){
    for(int x = 0 ; x < width ; x++){
        Vec4f BGRA = mFrame.at<Vec4f>(y,x);
        // BGRA Pixel Manipulations
        mFrame.at<Vec4f>(y,x) = BGRA;
    }
}

Mat mResult;
mFrame.convertTo(mResult, CV_8UC4, 1.0/255.0);