That's what I'm trying to do but I'm stuck at creating BOW vocabulary.
Here's the original C++ code:
// detecting keypoints
SurfFeatureDetector detector(400);
//FastFeatureDetector detector(1,true);
vector<KeyPoint> keypoints;
// computing descriptors
Ptr<DescriptorExtractor > extractor(
new OpponentColorDescriptorExtractor(
Ptr<DescriptorExtractor>(new SurfDescriptorExtractor())
)
);
Mat descriptors;
Mat training_descriptors(1,extractor->descriptorSize(),extractor-
>descriptorType());
Mat img;
while (dirp = readdir( dp ))
{
filepath = dir + "/" + dirp->d_name;
img = imread(filepath);
if (!img.data) {
continue;
}
detector.detect(img, keypoints);
extractor->compute(img, keypoints, descriptors);
training_descriptors.push_back(descriptors);
}
closedir( dp );
BOWKMeansTrainer bowtrainer(1000); //num clusters
bowtrainer.add(training_descriptors);
Mat vocabulary = bowtrainer.cluster();
FileStorage fs1("vocabulary_color_1000.yml", FileStorage::WRITE);
fs1 << "vocabulary" << vocabulary;
fs1.release();
My code:
SurfFeatureDetector detector = new SurfFeatureDetector();
SurfDescriptorExtractor extractor = new SurfDescriptorExtractor();
CvMat trainingDescriptors = CvMat.create(1, allFiles.length);
CvTermCriteria terminateCriterion = new
CvTermCriteria(CV_TERMCRIT_ITER, 100, 0.001);
terminateCriterion.epsilon(FLT_EPSILON);
BOWKMeansTrainer BOWtrainer = new BOWKMeansTrainer(10,
terminateCriterion, 3, 2);
for (int i = 0; i < allFiles.length; i++)
{
IplImage iplImage =
cvLoadImage(Environment.getExternalStorageDirectory() + "/
HockeyCardDetector/cards2/" + allFiles[i]);
String path = Environment.getExternalStorageDirectory() + "/
HockeyCardDetector/cards2/" + allFiles[i];
// detecting keypoints
KeyPoint keypoints = new KeyPoint();
//detector.get().detect(iplImage, keypoints, null);
detector.detect(iplImage, keypoints, null);
// computing descriptors
CvMat descriptors = new CvMat(null);
extractor.compute(iplImage, keypoints, descriptors);
BOWtrainer.add(descriptors);
}
CvMat vocabulary = BOWtrainer.cluster();
CvMemStorage storage = CvMemStorage.create();
CvFileStorage fileStorage =
CvFileStorage.open(Environment.getExternalStorageDirectory() + "/
HockeyCardDetector/vocabulary.xml", null, CV_STORAGE_WRITE, null);
cvWrite(fileStorage, "Vocabulary", vocabulary, cvAttrList());
cvReleaseFileStorage(fileStorage);
cvClearMemStorage(storage);
But still I have no idea where the problem can be.