我正在尝试绘制最大的轮廓,我正在实时工作,处理每个相机帧。我的输入图像将是手的,我有一些限制 - 黑色背景,没有镜面光。
我希望最大的轮廓尽可能接近下图
我的代码如下,我参考了许多在线可用的示例,我几乎认为我的代码没有任何问题。
mRgba = inputFrame.gray();
contours = new ArrayList<MatOfPoint>();
mcontours = new ArrayList<MatOfPoint>();
List<Mat> hull = new ArrayList<Mat>(contours.size());
hierarchy = new Mat();
Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 50, 50);
Imgproc.findContours(mIntermediateMat, contours, hierarchy,
Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
for (int idx = 0; idx != contours.size(); ++idx)
{
Mat contour = contours.get(idx);
double contourarea = Imgproc.contourArea(contour);
Log.i(TAG, "maxAreaIdx =" + idx + "contourarea = " + contourarea);
if (contourarea > maxArea)
{
maxArea = contourarea;
maxAreaIdx = idx;
Log.i(TAG, "maxAreaIdx =" + maxAreaIdx + "MaxArea = " + maxArea);
}
}
if(maxAreaIdx > 0 && maxAreaIdx < contours.size())
mcontours.add(contours.get(maxAreaIdx));
else
break;
Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA,
4);
hierarchy.release();
Imgproc.drawContours(mRgba, mcontours, -1, CONTOUR_COLOR, -1);
现在,我得到的只是其中的一小部分。我目前的理解是 OpenCV 本身无法检测到大的连续轮廓。请参考下面的图片。
不仅如此,我还对其他图像进行了测试,但不知何故我无法获得大而大的连续轮廓。
我先申请 Canny 有错吗?有没有更好的技术?我希望得到手部轮廓的轮廓。将来,我想将它与保存的类似轮廓数据库进行比较。我在正确的轨道上吗?