【发布时间】: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