我正在开发一个应用程序,它可以获取使用设备相机拍摄的图像的HU时刻。在达到HU矩计算之前的图像是:灰度,gausseanBlurr,二值化,canny算法,应用方法findcontour(),最后计算HU矩。所有这些都是在Android Studio上使用OpenCV完成的。
public void Hu()
{
Mat imagenOriginal;
imagenOriginal = new Mat();
Mat binario;
binario = new Mat();
Mat Canny;
Canny = new Mat();
Utils.bitmapToMat(bitmap, imagenOriginal);
Mat gris= new Mat(imagenOriginal.width() ,imagenOriginal.height(),imagenOriginal.type());
Imgproc.cvtColor(imagenOriginal, gris, Imgproc.COLOR_RGB2GRAY);
org.opencv.core.Size s = new Size(3,3);
Imgproc.GaussianBlur(gris, gris, s, 2);
Imgproc.threshold(gris, binario, 100, 255, Imgproc.THRESH_BINARY);
Imgproc.Canny(gris, Canny, 50, 50 * 3);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarcy = new Mat();
Imgproc.findContours(Canny, contours, hierarcy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(Canny, contours, -1, new Scalar(Math.random() * 255, Math.random() * 255, Math.random() * 255));
Moments momento = new Moments();
Mat hu= new Mat();
momento = Imgproc.moments(contours.get(0), false); // ERROR LINE
Imgproc.HuMoments(momento, hu);
}
当我执行计算时,Hu时刻就是我有错误的原因,因为每次q对图像应用某些算法时我都会进行测试。 如何获得HU时刻的代码来自这里:
Android: using hu moments opencv function to get the feature value
我也明白HU时刻保存在Hu变量中,但是我看不到打印所有值的方法。
谢谢!
答案 0 :(得分:0)
嗨,大哥:是的,我有同样的问题,我在寻找没有结果的WEB :(但是经过一段时间的思考,我得到了一个清晰的时刻:如果我有所有的时刻(中心,标准化,原始,等)在Moments函数中为什么我不能直接使用公式来获得Hu时刻,所以我做了它并且它有效!!请检查下面是否对你有帮助...
Moments p = new Moments();
List<Moments> nu = new ArrayList<Moments>(contours.size());
for(int i=0; i<contours.size(); i++)
{
nu.add(i, Imgproc.moments(contours.get(i),false));
p=nu.get(i);
}
//现在完成手动计算HU时刻 double [] moment = new double [8];
double
n20 = p.get_nu20(),
n02 = p.get_nu02(),
n30 = p.get_nu30(),
n12 = p.get_nu12(),
n21 = p.get_nu21(),
n03 = p.get_nu03(),
n11 = p.get_nu11();
//First moment
moments[0] = n20 + n02;
//Second moment
moments[1] = Math.pow((n20 - 02), 2) + Math.pow(2 * n11, 2);
//Third moment
moments[2] = Math.pow(n30 - (3 * (n12)), 2)
+ Math.pow((3 * n21 - n03), 2);
//Fourth moment
moments[3] = Math.pow((n30 + n12), 2) + Math.pow((n12 + n03), 2);
//Fifth moment
moments[4] = (n30 - 3 * n12) * (n30 + n12)
* (Math.pow((n30 + n12), 2) - 3 * Math.pow((n21 + n03), 2))
+ (3 * n21 - n03) * (n21 + n03)
* (3 * Math.pow((n30 + n12), 2) - Math.pow((n21 + n03), 2));
//Sixth moment
moments[5] = (n20 - n02)
* (Math.pow((n30 + n12), 2) - Math.pow((n21 + n03), 2))
+ 4 * n11 * (n30 + n12) * (n21 + n03);
//Seventh moment
moments[6] = (3 * n21 - n03) * (n30 + n12)
* (Math.pow((n30 + n12), 2) - 3 * Math.pow((n21 + n03), 2))
+ (n30 - 3 * n12) * (n21 + n03)
* (3 * Math.pow((n30 + n12), 2) - Math.pow((n21 + n03), 2));
//Eighth moment
moments[7] = n11 * (Math.pow((n30 + n12), 2) - Math.pow((n03 + n21), 2))
- (n20 - n02) * (n30 + n12) * (n03 + n21);
return moments;