我尝试使用推力从2D矩阵中找到最大元素。但是,我总是得到不正确的结果。这些代码适用于1D矩阵,但在使用2D矩阵时表现不可预测。
我将opencv GpuMat用于2D矩阵。这是我的代码。我想知道是否有人遇到同样的问题?
#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>
#include <thrust/extrema.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\cuda.hpp>
using namespace std;
using namespace cv;
using namespace cv::cuda;
ushort thrust_find_max_idx(const GpuMat& in_, int* p_r_, int* p_c_){
thrust::device_ptr<ushort> ptr((ushort*)in_.data);
unsigned int N = in_.cols * in_.rows;
thrust::device_vector<ushort>::iterator iter = thrust::max_element(ptr, ptr + N); //find max element
int pos = thrust::device_pointer_cast(&(iter[0])) - ptr;
*p_r_ = pos / in_.cols;
*p_c_ = pos % in_.cols;
return *iter;
}
int main(void)
{
Mat cpu_matrix; cpu_matrix.create(10, 10, CV_16UC1);
randu(cpu_matrix, 1, 256); //generate random sequences
GpuMat matrix; matrix.upload(cpu_matrix);
int r, c;
ushort max = thrust_find_max_idx( matrix, &r, &c);
matrix.download(cpu_matrix);
cout << cpu_matrix << endl; //output testing sequences
cout << max << " r " << r << " c " << c << endl; //output max element and positions
return 0;
}
答案 0 :(得分:1)
感谢Robert的回复,我意识到GpuMat默认情况下不会连续分配为Mat,但幸运的是,函数cuda::minMaxLoc()可用于快速识别GpuMat中的max元素。
double max; cv::Point loc;
cv::cuda::minMaxLoc(matrix, 0, &max, 0, &loc);