2013-02-11 17 views
0

我正在尝试使用FAST FeatureDetector来检测我的手机摄像头拍摄的视频的关键点。当我尝试运行matcher.match(descriptor1,descriptor2,matches)时,会出现错误。FeatureDetector.detect()函数错误

这里是我的代码:

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; 

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) 

我试图改变垫类型(目前CV_8UC4)。我只是无法弄清楚为什么当我尝试运行这场比赛时正在发生。

任何帮助非常感谢,谢谢!

+0

什么是logcat输出? – ArtemStorozhuk 2013-02-11 19:26:48

+0

请从您的logcat – endian 2013-02-11 19:35:31

+0

@Astor发布您的NullPointer堆栈跟踪嗨,我已经添加了我的logcat输出。 – user2062340 2013-02-11 19:40:30

回答

1

您需要创建您的keypoints1和keypoints2对象。像

keypoints1 = new MatOfKeyPoint(); 

因为现在它们是空的;

+0

如果他的代码片段是准确/完整的,'bgMat'很可能为空,也是 – Geobits 2013-02-11 20:46:59

+0

谢谢!我已经修复了这个错误,并且还有另外一个... – user2062340 2013-02-11 21:21:54