calcOpticalFlowPyrLK on OpenCV4Java

コードのシェアやメモなどのために、あたらしいブログを立てました。
Started this blog for source code sharing or memo.

This article is based on Java 1.6, OpenCV 2.4.9.

I have struggled to use calcOpticalFlowPyrLK function on OpenCV for Java/Android code, because I couldn’t find good perfect sample.

I refereed following links.

As a basic knowledge, we need to call following three functions. We need to be aware that OpenCV is C language style API. Some of argument is used for output.

  1. Imgproc.goodFeaturesToTrack : corners is output
  2. Imgproc.cornerSubPix : corners is output
  3. Video.calcOpticalFlowPyrLK : nextPts is output

Basically, we need to prepare many parameters including TermCriteria object and two Mat objects to hold gray scale picture as input for goodFeatureToTrack, like this.

Mat nextGray = new Mat(nextImg.height(),nextImg.width(),CvType.CV_8UC1);
Imgproc.cvtColor(nextImg, nextGray, Imgproc.COLOR_RGB2GRAY);
MatOfPoint corners = new MatOfPoint();

The result will be set on MatOfPoint object, and needed to be copied as MatOfPoint2f object for input to cornerSubPix.

MatOfPoint2f prevPts = new MatOfPoint2f(corners.toArray());

Three result well be made with two set of MatOfPoint2f objects as pointers and one MatOfByte object as status. Scan the status metrics, the position has feature point when the flag status is 1.

List<Point> p0a = prevPts.toList();
List<Point> p1a = nextPts.toList();
List<Byte> sa = status.toList();
for (int i = 0; i < sa.size(); i++) {
    if(sa.get(i) == 1) {
        Core.circle(target, p1a.get(i), 10, new Scalar(0,0,255));
        Core.line(target, p0a.get(i), p1a.get(i), new Scalar(255,0,0), 2,8,0);
    }
}

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中