【问题标题】:Android OpenCV convertTo() from CV_32FC4 to CV_8UC4Android OpenCV convertTo() 从 CV_32FC4 到 CV_8UC4
【发布时间】:2018-04-21 08:47:11
【问题描述】:

我刚接触 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

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

【问题讨论】:

  • mFrame.at 表示mframe的每个像素都是CV_8UC3 (BGR),不是4个浮点数。在您的示例中,可能不应该有任何伤害,您读取 3 个字节并将它们放回......但如果您在中间以任何方式更改它们,它应该。使用 Vec4f 并记住这不是 BGR,因为你有第四个频道!

标签: android c++ opencv android-ndk


【解决方案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);

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2020-01-18
    相关资源
    最近更新 更多