在将一个 GPU 特征描述矩阵转换为带有开口的 CPU 特征描述矩阵时,我遇到了一些问题,使用:
void downloadDescriptors(const GpuMat& descriptorsGPU, vector<float>& descriptors);
您可以看到, 此方法将持有描述符的 GpuMat 转换为持有该指示符的浮标矢量。 问题是, 当我访问此矢量的某些元素时, 返回的值与 < code> 0 code > 到 < code> 255 code > 的预期间隔相当不同。 我做了以下测试程序, 以比较通过 < code > SURF_ GPU code > 和 < code > SURF code > 获取的提取时间和描述时间 :
clock_t start;
clock_t end;
SURF_GPU surfGPU;
SURF surf;
Mat img1 = imread("Ipo_SP_01.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat outimageGPU;
Mat outimageCPU;
GpuMat imgGPU;
imgGPU.upload(img1);
vector<KeyPoint> keyp_A;
vector<KeyPoint> keyp_B;
GpuMat keypGPU;
vector<float> descriptorsConverted;
Mat descriptorsCPU;
GpuMat descriptorsGPU;
start = (clock() * 1000)/CLOCKS_PER_SEC;
surfGPU(imgGPU, GpuMat(), keypGPU, descriptorsGPU);
end = (clock() * 1000)/CLOCKS_PER_SEC;
cout << "GPU time: " << end - start << endl;
surfGPU.downloadKeypoints(keypGPU, keyp_A);
surfGPU.downloadDescriptors(descriptorsGPU, descriptorsConverted);
cout << "GPU Keypoints = " << keyp_A.size() << endl;
start = (clock() * 1000)/CLOCKS_PER_SEC;
surf(img1, Mat(), keyp_B, descriptorsCPU);
end = (clock() * 1000)/CLOCKS_PER_SEC;
cout << "CPU time: " << end - start << endl;
cout << "CPU Keypoints = " << keyp_B.size() << endl;
drawKeypoints(img1, keyp_A, outimageGPU, Scalar(255, 255, 255), DrawMatchesFlags::DEFAULT);
imwrite("GPU.jpg", outimageGPU);
drawKeypoints(img1, keyp_B, outimageCPU, Scalar(255, 255, 255), DrawMatchesFlags::DEFAULT);
imwrite("CPU.jpg", outimageCPU);
return 0;
检查 descritors 元素的元素 翻转
,我期望在 0
和 255
之间得到数值,就像我访问 descritors CPU
元素时得到的数值一样。 相反,我得到了以下数值:
-0.000621859
0.000627841
-0.000503146
0.000543773
-8.69408e-05
0.000110254
0.000265697
0.000941789
0.0595061
0.0619723
我怀疑这个问题与 download Descritors
返回的类型有关,尽管它会返回浮控矢量。