3

일부 내장형 OpenCV 기능 감지기를 사용하여 이미지에서 기능 감지를 실행하려고합니다. 그러나, 나는 오직 최고/최고 n 기능을 이미지에 나타 내기를 원합니다 (이 예제에서는 30을 말합니다). 이미 피쳐를 찾은 다음 다른 피사체에서 그 피사체를 식별하는 코드를 사용했지만 발견 된 키포인트 수를 제한하는 방법을 찾을 수 없습니다. 나는 다음과 같이 다양한 감지기/추출기/매처 (matcher)를 초기화 : 나는 이미 SO 해결책을 찾기 위해 시도했지만 유일한 해결책은 내가 aren't for the android version of OpenCV을 찾을 수 있습니다Android OpenCV에서 키포 수 설정

private final FeatureDetector mFeatureDetector = FeatureDetector.create(FeatureDetector.ORB); 
private final DescriptorExtractor mDescriptorExtractor = descriptorExtractor.create(DescriptorExtractor.ORB); 
private final DescriptorMatcher mDescriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); 

. 이와 유사한 방법을 이러한 방법으로 시도해도 효과가 없었습니다.

제가 생각할 수있는 유일한 방법은 처음 30 개의 기능을 사용하는 것뿐입니다. 그러나 이미지의 한 부분에 모두 클러스터링 될 수 있으므로 제대로 작동하지 않을 것이라고 생각합니다. 그래서 30 대 기능을 선택하는 방법을 아는 사람이 있는지 궁금합니다. 나는 MSER, ORB, SIFT, SURF, STAR, GFTT 등 어떤 특징 탐지 알고리즘을위한 솔루션인지 신경 쓰지 않는다.

또한 정확히 30 개의 기능을 감지해야하므로 "약"정도가 될 때까지 감도로 재생하는 것은 옵션이 아닙니다.

편집 : 정확하게 30 개의 기능을 찾을 필요가있는 이유는 그것들을 내 탐지기를 훈련시키는 데 사용할 것입니다. 아이디어는 일련의 훈련 이미지 각각에서 30 개의 피쳐를 얻은 다음 그 결과를 사용하여 한 장면에서 다시 피사체를 찾는 것입니다. 교육 이미지가 객체의 클로즈업에 가까워 지므로 피쳐가 이미지의 한 부분에 클러스터되지 않을 수도 있습니다.

+2

모든 알고리즘에는 https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp에서와 같이'nFeatures' (src의 SURF 생성자 참조)가 없습니다. # L79. Java 래퍼는 각 알고리즘에 대해 제공되지 않기 때문에 자유롭지 않을 수 있습니다. 우리는 단지'create'라는 이름을 가지고 있습니다. 또한 최상의 30 가지 기능을 제공하더라도 이미지의 한 부분에 클러스터되지 않을 것이라는 보장은 없습니다.제한 기능에 대한 필요성을보다 명확하게 나타낼 수 있습니까? 'knnMatch' 또는'radiusMatch'가 도움이 될까요? – Kiran

+0

필자는 필자가 필자의 기능을 제한해야하는 이유로 필자의 질문을 업데이트했습니다 (필자는 일정한 기능을 필요로하는 방식으로 필자의 감지기를 교육하고 있습니다). 불행히도 나는'knnMatch' 또는'radiusMatch'가 도움이 될 것이라고 생각하지 않지만, 생각에 감사드립니다. nFeatures 알고리즘이 어떻게 구현되었는지 알고 있습니까? – TheOmegaPostulate

+1

정확한 질문을 이해했는지 확실하지 않습니다. C++에서 피처 포인트 (SURF에서 알고있는 점)는 사용 된 필터의 응답으로 정렬됩니다. 안드로이드에 없다면 스스로 발견 할 수 있습니다. 탐지 한 모든 키포인트는 플로트 응답 멤버 값을 가지고 있기 때문에 스스로 할 수 있습니다. 따라서 목록의 처음 30 개 키포인트를 가장 높은 응답을 가진 키포인트로 가져 가야합니다. 그들은 자연의 이미지의 일부에 clusterd되지 않습니다! – PeterNL

답변

0

검색 할 키포인트의 수를 설정하는 방법을 찾지 못했지만 이후 키포인트의 정확한 수를 추출하는 방법을 알아 냈습니다. 이렇게하는 것은 계산 상 효율적이지는 않지만 내가받은 의견에서 이전에 그렇게 생각하지는 않습니다.

내 키포인트 변수이다

private final MatOfKeyPoint mTargetKeypoints = new MatOfKeyPoint(); 

이 기능을 "충전"되면 (배열로 변환하여 각 특성을 추출 할 수있다 (이것은 500 후에 중지 것) 여기에서 각 요소 배열 특징이다

mTargetKeypoints.toArray()[0]; //NOTE: Not actual code, used in a print statement 

I는 결과 위에 인쇄 할 때이다.

키포인트 [PT = {82.0, 232.0} 크기 = 31.0, 각 = 267.77094 응답 = 0.0041 551,706, 옥타브 = 0 CLASS_ID = -1] 개인 정보를 다음 붙박이 키포인트 기능, 예를 추출 할 수

:

응답가 나타내는
mTargetKeypoints.toArray()[0].pt.x //Printing outputs x location of feature. 
mTargetKeypoints.toArray()[0].response // Printing outputs response of feature. 

This가 SO 질문 나타낸다고 "얼마나 잘 "키포인트가 있습니다. 따라서 여기에서 사용하기에 가장 좋은 30 가지 기능을 선택하는 것은 비교적 간단합니다.