使用欧几里德范数计算物体的实际宽度

时间:2017-06-22 17:40:04

标签: java android opencv

我尝试使用opencv以cm为单位计算对象的实际宽度。以下是我的代码。由于某种原因,宽度不准确。

public static void drawContours(Mat image, ArrayList<MatOfPoint> contours){
        //ArrayList<MatOfPoint> contourList = getContoursLargerThan(contours, 1000);
        //Random random = new Random();

        if(contours != null && contours.size()>0) {
//            for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
//                Imgproc.drawContours(image, contours, contourIdx, new Scalar(255,0,0),3);//random.nextInt(256), random.nextInt(256), random.nextInt(256)),3);
//            }
            for (MatOfPoint temp : contours) {
                Rect rect = Imgproc.boundingRect(temp);
                Point p1 = new Point(rect.x, rect.y);
                Point p0 = new Point(rect.x + rect.width, rect.y + rect.height);
                double realWidthInCm = sqrt( (p1.x-p0.x)*(p1.x-p0.x) + (p1.y-p0.y)*(p1.y-p0.y) );
                Log.d(TAG,"Real wiidth " +realWidthInCm);
                Imgproc.rectangle(image, p1, p0,new Scalar(0,255,0),2);
            }
        }
    }

我试图通过使用欧几里德规范来计算它。我错过了什么?我怎样才能得到真正的宽度?

1 个答案:

答案 0 :(得分:0)

为了避免混淆:你要求宽度但计算对角线。我假设你真的想要对角线并且没有得到预期的结果。这是因为库不以厘米为单位测量大小。它不能这样做,因为对象的大小取决于您的显示设备。要调整您获得的值,您需要乘以特定于您的屏幕/显示的比例因子。例如,如果realWidthInCm为3厘米,但您观察到宽度/对角线为2厘米,那么比例因子2/3应该会纠正您的结果。

如果您正在使用像素,则可能需要使用this转换为米。