最大の輪郭を描画しようとしています。リアルタイムで作業して、各カメラ フレームを処理しています。私の入力画像は手で作られます。いくつかの制約があります - 黒の背景、鏡面反射光なし。
最大の輪郭が下の画像にできるだけ近いと思います
私のコードは次のとおりです。オンラインで入手できる多くのサンプルを参照しましたが、コードに問題はないとほとんど考えています。
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 自体が大きな連続した輪郭を検出できないということです。以下の画像を参照してください。
これだけでなく、他の画像でもテストしましたが、どういうわけか大きな大きな連続した輪郭を取得できません。
最初にキャニーを適用するのは間違っていますか? より良いテクニックはありますか?手の輪郭の輪郭を取得したい。将来的には、保存されている同様の等高線データベースと比較したいと考えています。私は正しい軌道に乗っていますか?