如何使用android相机找到物体的真实宽度和高度?
Posted
技术标签:
【中文标题】如何使用android相机找到物体的真实宽度和高度?【英文标题】:How to find real width and height of objects using android camera? 【发布时间】:2016-02-26 07:24:32 【问题描述】: I want to find object's real height and width using android camera, I am using OpenCv library for Image Processing. I can get height and width in the Image by finding contour , but it is not real height and width it changes when the object's move far from the device. My main purpose is to measure actual width and height of wounds.
使用下面的代码我可以使用下面的代码标记伤口位置。我可以轻松地标记伤口,但我从处理后的图像中得到的宽度和高度是错误的。它不是标记位置的实际宽度和高度。我想我需要更多关于图像的细节以及与相机的距离等。
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)
mRgba = inputFrame.rgba();
contours = new ArrayList<MatOfPoint>();
hierarchy = new Mat();
Imgproc.GaussianBlur(mRgba,mIntermediateMat,new Size(9,9),2,2);
Imgproc.Canny(mRgba, mIntermediateMat, 80, 100);
Imgproc.findContours(mIntermediateMat, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));
/* Mat drawing = Mat.zeros( mIntermediateMat.size(), CvType.CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
Scalar color =new Scalar(Math.random()*255, Math.random()*255, Math.random()*255);
Imgproc.drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, new Point() );
*/
hierarchy.release();
// Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4)
/* Mat drawing = Mat.zeros( mIntermediateMat.size(), CvType.CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
`enter code here`
Scalar color =new Scalar(Math.random()*255, Math.random()*255, Math.random()*255);
Imgproc.drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, new Point() );
*/
for ( int contourIdx=0; contourIdx < contours.size(); contourIdx++ )
// Minimum size allowed for consideration
MatOfPoint2f approxCurve = new MatOfPoint2f();
MatOfPoint2f contour2f = new MatOfPoint2f( contours.get(contourIdx).toArray() );
//Processing on mMOP2f1 which is in type MatOfPoint2f
double approxDistance = Imgproc.arcLength(contour2f, true)*0.02;
Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);
//Convert back to MatOfPoint
MatOfPoint points = new MatOfPoint( approxCurve.toArray() );
// Get bounding rect of contour
Rect rect = Imgproc.boundingRect(points);
Core.rectangle(mRgba, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0, 255), 3);
return mRgba;
【问题讨论】:
嗨,请让我了解我的问题,继续我的项目对我来说非常重要。 为我的问题投票,因为下面的答案是正确的,而且效果很好。我需要问更多问题。 ,你找到答案了吗? 是的,下面的答案很好。 【参考方案1】:您的问题非常笼统。您没有说明您要衡量的是什么,所以我会笼统地回答。
您实际上并没有在计算机视觉中使用相机找到任何真实对象的宽度和高度。您正在使用从相机捕获的 frame 中提取的一些参数对它们进行建模,这是一个 2d 数字图像,在最新的 opencv 中由 Mat 表示 - 简单地说,矩阵与表示像素数据和一些元数据的二维数字数组的图像宽度、高度。由于您捕获该帧并将处理后的帧返回到 android 部分(如果 需要 - 例如,您需要流式传输相机)Android 和 OpenCV是完全分开的东西。您可以使用 Google Camera API 从相机捕获帧并将其转换为 Mat 或实现 opencv View(这种方式更简单,有问题,老实说,很烂)。 在此矩阵或从图像 Mat 获取的其他矩阵(如多边形轮廓点)上,您应用来自 opencv 模块的方法。其中一些可以在图像的特定区域上绘制/返回矩形(通常 || 到图像边框)。 一般,你可以使用方法族找到smth的轮廓
void findContours(.., List < MatOfPoint> countors, ..)
然后使用
Rect rect = boundingRect(MatOfPoint contour);
在该列表的轮廓r上(如果有)以获取 Rect 周围的东西。显然,如果您拥有轮廓权,那么 Rect 将具有您正在寻找的宽度和高度。这些几乎是图像中的二维对象上的“像素高度和宽度”。
要获得真实物理对象的尺寸,您必须有一些物理几何模型,并使用该模型中的公式计算找到的数字。 例如,如果您的对象与相机(手机)平行并且居中你可以
final double realWorldHeight = rect.size().height / imageMat.size().height *
realWorldDistanceToObject * Math.cos( realWorldAngleOfObjectHeight / 2);
物体的角度是指物体从相机的观察点垂直占据多少弧度。
【讨论】:
如果我的相机向下对焦,我如何找到光辉,请给我一些代码来找到光辉。 这里:***.com/a/12118760/5059838 如您所见,使用 Math.toRadians(degrees) 来获取弧度而不是度数。如果有帮助,您应该标记答案。 这是一个很好的答案,我现在可以计算宽度和高度。但我想手动给出 realWorldDistanceToObject,我希望我们的程序也能找到它?你有什么想法吗? 请给我一个更好的答案来找到 realWorldDistanceToObject ? 无法从手机内部计算所有物理测量值。您需要知道至少 1 个物理维度才能获得所有其他参数。因此,您要么知道确切的尺寸(物体的 1 维,如高度),要么知道真实世界的距离(你用米测量它或使用预定义的系统)。看看这是我的答案以澄清原因:***.com/a/35652500/5059838以上是关于如何使用android相机找到物体的真实宽度和高度?的主要内容,如果未能解决你的问题,请参考以下文章
测量 Yolo 检测到的物体的尺寸。前任。高度,宽度,与相机的距离