我尝试使用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);
}
}
}
我试图通过使用欧几里德规范来计算它。我错过了什么?我怎样才能得到真正的宽度?
答案 0 :(得分:0)
为了避免混淆:你要求宽度但计算对角线。我假设你真的想要对角线并且没有得到预期的结果。这是因为库不以厘米为单位测量大小。它不能这样做,因为对象的大小取决于您的显示设备。要调整您获得的值,您需要乘以特定于您的屏幕/显示的比例因子。例如,如果realWidthInCm
为3厘米,但您观察到宽度/对角线为2厘米,那么比例因子2/3
应该会纠正您的结果。
如果您正在使用像素,则可能需要使用this转换为米。