thrust :: max_element()返回2D矩阵的错误值

时间:2014-08-26 15:45:58

标签: c++ opencv thrust

我尝试使用推力从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; 
}

1 个答案:

答案 0 :(得分:1)

感谢Robert的回复,我意识到GpuMat默认情况下不会连续分配为Mat,但幸运的是,函数cuda::minMaxLoc()可用于快速识别GpuMat中的max元素。

double max; cv::Point loc;
cv::cuda::minMaxLoc(matrix, 0, &max, 0, &loc);