У меня есть проект opencv, пишущий на c ++, который я бы преобразовал в java с помощью javacv
учитывая этот метод, написанный на C ++:
void extractBOWDescriptor(const path& basepath, Mat& descriptors, Mat& labels) {
for (directory_iterator iter = directory_iterator(basepath); iter
!= directory_iterator(); iter++) {
directory_entry entry = *iter;
if (is_directory(entry.path())) {
cout << "Processing directory " << entry.path().string() << endl;
extractBOWDescriptor(entry.path(), descriptors, labels);
} else {
path entryPath = entry.path();
if (entryPath.extension() == ".jpg") {
cout << "Processing file " << entryPath.string() << endl;
Mat img = imread(entryPath.string());
if (!img.empty()) {
vector<KeyPoint> keypoints;
detector->detect(img, keypoints);
if (keypoints.empty()) {
cerr << "Warning: Could not find key points in image: "<< entryPath.string() << endl;
} else {
Mat bowDescriptor;
bowDE.compute(img, keypoints, bowDescriptor);
descriptors.push_back(bowDescriptor);
float label=atof(entryPath.filename().c_str());
labels.push_back(label);
}
} else {
cerr << "Warning: Could not read image: "<< entryPath.string() << endl;
}
}
}
}
}
Нет документации по javacv, и я не разработчик C ++, поэтому я стараюсь внимательно следовать некоторым примерам javacv, и это результат, который я получил;
public void extractBOWDescriptor (String baseurl , CvMat descriptors , CvMat labels)
{
File dir = new File(baseurl);
for (File child : dir.listFiles())
{
if (child.isDirectory())
{
System.out.println("Processing directory"+child.getAbsolutePath());
extractBOWDescriptor(child.getName(), descriptors, labels);
}else
{
if (child.getName().contains(".jpg"))
{
System.out.println("Processing file" + child.getName());
final CvMat image = cvLoadImageM(child.getName());
if (!image.empty())
{
KeyPoint keypoints = new KeyPoint(); // a verifier
featureDetector.detect(image, keypoints, null);
if (keypoints.isNull())
{
System.out.println("Warning: Could not find key points in image: "+
child.getName()
);
}
else
{
CvMat BoWdescriptors = new CvMat() ; //
bDescriptorExtractor.compute(image, keypoints, BoWdescriptors, null, null);
descriptors.put(descriptors);
float label=Float.parseFloat(child.getName());
labels.put(label);
}
}
else
{
System.out.println("Warning: Could not read image: "+ child.getName());
}
}
}
}
}
Является ли преобразование правильным? Особенно меня интересуют строки:
Mat bowDescriptor; --> CvMat BoWdescriptors = new CvMat() ;
а также
float label=atof(entryPath.filename().c_str());--> float label=Float.parseFloat(child.getName());
Задача ещё не решена.
Других решений пока нет …