OpenFrameworks、OpenCV、および Box2D を使用して、良好なフレームレートで達成できました。Android を使用することは、はるかに複雑な作業のように思えます (私が Java の初心者であることも一因です)。
これが私が始めた方法です:
「OpenCV サンプル - 画像操作」を使用し、輪郭を見つけるのに最適な素敵な白黒画像を生成する「キャニー」効果以外のすべてを削除します。
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); Imgproc.Canny(mRgbaInnerWindow, mIntermediateMat, 50, 100); Imgproc.cvtColor(mIntermediateMat, mRgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4); return mRgba; }
「OpenCV Sample - color-blob-detection」から、Mat の輪郭を見つけるロジックを取得しました。
// These two lines are actually in the function onCameraViewStarted mHierarchy = new Mat(); CONTOUR_COLOR = new Scalar(255,0,0,255); // These lines are in function onCameraFrame List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.findContours(mRgbaInnerWindow, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); Imgproc.drawContours(mIntermediateMat, contours, -1, CONTOUR_COLOR);
したがって、私の現在の関数は次のようになり、機能しません。
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); if ((mRgbaInnerWindow == null) || (mGrayInnerWindow == null) || (mRgba.cols() != mSizeRgba.width) || (mRgba.height() != mSizeRgba.height)) CreateAuxiliaryMats(); Imgproc.Canny(mRgbaInnerWindow, mIntermediateMat, 50, 100); //Imgproc.cvtColor(mIntermediateMat, mRgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4); List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.findContours(mRgbaInnerWindow, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); //Imgproc.drawContours(mIntermediateMat, contours, -1, CONTOUR_COLOR); return mRgba; }
今、これは私が立ち往生しているところです。例外が発生し続け、正しい寸法を使用していないか、マットを正しい色空間に変換していないと思います。この投稿にはいくつかの洞察がありますが、それが正しいかどうかはわかりません: OpenCV on Android findContours throws Exception