Skip to content
This repository was archived by the owner on Jul 20, 2023. It is now read-only.

Commit ee7e3a1

Browse files
committed
Manage descriptor buffer more safely
1 parent f5bf2e2 commit ee7e3a1

File tree

1 file changed

+8
-10
lines changed

1 file changed

+8
-10
lines changed

src/SolARDescriptorMatcherKNNOpencv.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,26 +72,24 @@ FrameworkReturnCode SolARDescriptorMatcherKNNOpencv::match(SRef<DescriptorBuffer
7272
//since it is an openCV implementation we need to convert back the descriptors from SolAR to Opencv
7373
uint32_t type_conversion= SolAROpenCVHelper::deduceOpenDescriptorCVType(desc1->getDescriptorDataType());
7474

75-
cv::Mat cvDescriptor1(desc1->getNbDescriptors(), desc1->getNbElements(), type_conversion);
76-
cvDescriptor1.data=(uchar*)desc1->data();
77-
78-
cv::Mat cvDescriptor2(desc2->getNbDescriptors(), desc2->getNbElements(), type_conversion);
79-
cvDescriptor2.data=(uchar*)desc2->data();
75+
cv::Mat cvDescriptor1(desc1->getNbDescriptors(), desc1->getNbElements(), type_conversion, (uchar*)desc1->data());
76+
cv::Mat cvDescriptor2(desc2->getNbDescriptors(), desc2->getNbElements(), type_conversion, (uchar*)desc2->data());
8077

78+
cv::Mat cvDescriptor1Float, cvDescriptor2Float;
8179
if (desc1->getDescriptorDataType() != DescriptorDataType::TYPE_32F)
82-
cvDescriptor1.convertTo(cvDescriptor1, CV_32F);
80+
cvDescriptor1.convertTo(cvDescriptor1Float, CV_32F);
8381
if (desc2->getDescriptorDataType() != DescriptorDataType::TYPE_32F)
84-
cvDescriptor2.convertTo(cvDescriptor2, CV_32F);
82+
cvDescriptor2.convertTo(cvDescriptor2Float, CV_32F);
8583

8684
std::vector< std::vector<cv::DMatch> > nn_matches;
8785

8886
#ifdef WITHCUDA
8987
cv::cuda::GpuMat cvDescriptor1Gpu, cvDescriptor2Gpu;
90-
cvDescriptor1Gpu.upload(cvDescriptor1);
91-
cvDescriptor2Gpu.upload(cvDescriptor2);
88+
cvDescriptor1Gpu.upload(cvDescriptor1Float);
89+
cvDescriptor2Gpu.upload(cvDescriptor2Float);
9290
m_matcher->knnMatch(cvDescriptor1Gpu, cvDescriptor2Gpu, nn_matches, 2);
9391
#else
94-
m_matcher->knnMatch(cvDescriptor1, cvDescriptor2, nn_matches, 2);
92+
m_matcher->knnMatch(cvDescriptor1Float, cvDescriptor2Float, nn_matches, 2);
9593
#endif // WITHCUDA
9694
std::map<uint32_t, std::map<uint32_t, float>> matches21;
9795
for(unsigned i = 0; i < nn_matches.size(); i++) {

0 commit comments

Comments
 (0)