gpt4 book ai didi

python - OpenCV - 是否存在在 python 中执行 BOW(词袋)的函数?

转载 作者:太空宇宙 更新时间:2023-11-03 23:01:04 29 4
gpt4 key购买 nike

我必须使用 OpenCV 2.4.6 来做 BOW(词袋),我所有的代码都是 C++。现在我想用 python 来做。

我搜索了 OpenCV-python 引用资料 ( http://opencv.willowgarage.com/documentation/python/ )。但我没有得到答案。然后从http://answers.opencv.org/question/10870/python-wrapper-for-bow/ ,我知道也许没有用于弓的 OpenCV-python。谁能找到它?

由于我已经使用 C++ 训练了词汇表,现在当我得到一张照片时,我想将 BOW 向量与词汇表进行比较。 C++ 使用 BOWImgDescriptorExtractor() 函数来完成。是否存在像BOWImgDescriptorExtractor()这样的python代码?

最佳答案

我写了一个这样的示例代码,(1)首先,我们使用python c++ api训练bow词汇并保存到文件中。(2) 编写c++代码得到图像的弓形矢量化表示代码是:

vector<double> features;//store the feature
bool readVocabulary(const string& filename, Mat& vocabulary) {
FileStorage fs(filename, FileStorage::READ);
if (fs.isOpened()) {
fs["vocabulary"] >> vocabulary;
return true;
}
return false;
}
//imgpath is the image filepath, vocpath is the voc path
void getImgBow(char* imgpath, char* vocpath) {
cv::initModule_nonfree();
Ptr<FeatureDetector> featureDetector = FeatureDetector::create("SURF");
Ptr<DescriptorExtractor> descExtractor =
DescriptorExtractor::create("SURF");
Ptr<DescriptorMatcher> descMatcher =
DescriptorMatcher::create("FlannBased");
Ptr<BOWImgDescriptorExtractor> bowExtractor;
if (featureDetector.empty() || descExtractor.empty() || descMatcher.empty()) {
cout << "featureDetector or descExtractor was not created" << endl;
}
bowExtractor = new BOWImgDescriptorExtractor(descExtractor, descMatcher);
Mat vocabulary;
readVocabulary(vocpath, vocabulary);
bowExtractor->setVocabulary(vocabulary);
Mat img = imread(imgpath);
if (img.rows < img.cols)
cv::resize(img, img, Size(320, 240));
else
cv::resize(img, img, Size(240, 320));
vector<KeyPoint> keypoints;
Mat descriptors;
featureDetector->detect(img, keypoints);
bowExtractor->compute(img, keypoints, descriptors);
for (int j = 0; j < descriptors.cols; j++) {
float value = descriptors.at<float> (0, j);
features.push_back(value);
}
}

(3),我们将c++代码编码为python模块:

PyObject* wrap_contentfilter(PyObject* self, PyObject* args) {
//parse the python parameters.
if (!PyArg_ParseTuple(args, "sssOO", &imgpath, &vocpath, &modelpath,
&candidate_list, &can_pro_lsit))
//you may use PyInt_AsSsize_t and so on to do type change.
//invoke getImgBow function.
//construct PyObject and return to python, use PyList_SetItem function,PyObject*
}

static PyMethodDef predictMethods[] = { { "content_filter", wrap_contentfilter,
METH_VARARGS, "get image's bow, predict" }, { NULL, NULL } };
extern "C"
void initcontentfilter() {
PyObject* m;
m = Py_InitModule("contentfilter", predictMethods);
}

(4)我们写了一个python例子来调用c++函数。

import contentfilter
contentfilter.content_filter(parameters)

(5)编译c++函数:

g++ -fPIC  content_filter.cpp -o contentfilter.so  -shared -I/usr/local/include -I/usr/include/python2.7 -I/usr/lib/python2.7/config -L/usr/local/lib  -lopencv_highgui -lopencv_nonfree -lopencv_legacy -lopencv_ml -lopencv_features2d -lopencv_imgproc -lopencv_core

(6) python example.py

关于python - OpenCV - 是否存在在 python 中执行 BOW(词袋)的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18200084/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com