2

FAST FeatureDetector を使用して、携帯電話のカメラで撮影したビデオのキーポイントを検出しようとしています。matcher.match(descriptor1,descriptor2, matches) を実行しようとすると、エラーになります。

これが私のコードです:

private Mat bgMat; //contains the first frame taken by the camera
private Mat fgMat; //contains the second frame
private MatOfKeyPoint keypoints1;
private MatOfKeyPoint keypoints2;
private Mat descriptor1;
private Mat descriptor2;

public void onCameraViewStarted(int width, int height) {
    Log.v("DEBUG","Width = " + width + ", height = " + height);
    mRgba = new Mat(height, width, CvType.CV_8UC4);
    bgMat = new Mat(height, width, CvType.CV_8UC4);
    fgMat = new Mat(height, width, CvType.CV_8UC4);
    mGrayMat = new Mat(height, width, CvType.CV_8UC1);
    descriptor1 =new Mat(height, width, CvType.CV_8U);  //I have changed the way to                                                  
descriptor2 =new Mat(height, width, CvType.CV_8U);  //initialize descriptor1 & 2
}


FeatureDetector FAST = FeatureDetector.create(FeatureDetector.FAST);

keypoints1 = new MatOfKeyPoint();
keypoints2 = new MatOfKeyPoint();
//descriptor1 =new Mat();
// descriptor2 =new Mat();
matches= new MatOfDMatch();

FAST.detect(bgMat, keypoints1);
FAST.detect(fgMat, keypoints2);
DescriptorExtractor Extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
Extractor.compute(bgMat, keypoints1, descriptor1);
Extractor.compute(fgMat, keypoints2,descriptor2);

DescriptorMatcher matcher =DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);             
matcher.match(descriptor1,descriptor2, matches);
Features2d.drawMatches(bgMat, keypoints1, fgMat, keypoints2, matches, inputFrame);

これが私のlogcat出力です:

02-11 13:00:25.926: E/cv::error()(16153): OpenCV Error: Assertion failed (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U)) in void cv::batchDistance(cv::InputArray, cv::InputArray, cv::OutputArray, int, cv::OutputArray, int, int, cv::InputArray, int, bool), file /home/oleg/sources/opencv/modules/core/src/stat.cpp, line 1803
02-11 13:00:25.926: W/dalvikvm(16153): threadid=11: thread exiting with uncaught exception (group=0x415eb2a0)
02-11 13:00:25.926: E/AndroidRuntime(16153): FATAL EXCEPTION: Thread-3281
02-11 13:00:25.926: E/AndroidRuntime(16153): CvException [org.opencv.core.CvException: /home/oleg/sources/opencv/modules/core/src/stat.cpp:1803: error: (-215) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function void cv::batchDistance(cv::InputArray, cv::InputArray, cv::OutputArray, int, cv::OutputArray, int, int, cv::InputArray, int, bool)
02-11 13:00:25.926: E/AndroidRuntime(16153): ]
02-11 13:00:25.926: E/AndroidRuntime(16153):    at org.opencv.features2d.DescriptorMatcher.match_1(Native Method)
02-11 13:00:25.926: E/AndroidRuntime(16153):    at org.opencv.features2d.DescriptorMatcher.match(DescriptorMatcher.java:437)
02-11 13:00:25.926: E/AndroidRuntime(16153):    at com.example.cvcamt.MainActivity.onCameraFrame(MainActivity.java:152)
02-11 13:00:25.926: E/AndroidRuntime(16153):    at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:283)
02-11 13:00:25.926: E/AndroidRuntime(16153):    at org.opencv.android.NativeCameraView$CameraWorker.run(NativeCameraView.java:144)
02-11 13:00:25.926: E/AndroidRuntime(16153):    at java.lang.Thread.run(Thread.java:856)

Mat タイプ (現在は CV_8UC4) を変更し、他のエクストラクターと他のマッチャーを変更してみましたが、状況はまったく変わりません。

記述子のプロパティのログ:

02-16 23:56:08.770: V/DEBUG(24163): descriptor1 = Mat [ 240*320*CV_8UC1, isCont=true,     isSubmat=false, nativeObj=0x5e42e298, dataAddr=0x5f713010 ], descriptor2 = Mat [ 240*320*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x5e42e2d8, dataAddr=0x5f726010 ]

どんな助けでも大歓迎です、ありがとう!

4

0 に答える 0