我刚认识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,所以我认为这不是我的设备的问题。可能是什么问题?
答案 0 :(得分:1)
Vec4f
访问它。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);