2013-05-28 5 views
1

Я загружаю файл .png с использованием OpenCV, и я хочу извлечь его значения синей интенсивности, используя библиотеку тяги.Вызов пользовательских функций в тяге

Мой код выглядит следующим образом:

  1. Загрузка изображения с помощью OpenCV IplImage указатель
  2. Копирование данных изображения в thrust::device_vector
  3. Извлечение значения интенсивности синего цвета из вектора устройства внутри структуры с использованием библиотеки тяги ,

Теперь у меня возникла проблема с извлечением значений синей интенсивности из вектора устройства.

  • Я сделал этот код в cuda уже сейчас, преобразовывая его с помощью библиотеки тяги.
  • Я извлекаю синие значения интенсивности внутри этой функции.
  • Я хочу знать, как назвать эту структуру FetchBlueValues из основной функции.

Код:

#define ImageWidth 14 
#define ImageHeight 10 

thrust::device_vector<int> BinaryImage(ImageWidth*ImageHeight); 
thrust::device_vector<int> ImageVector(ImageWidth*ImageHeight*3); 

struct FetchBlueValues 
{ 
    __host__ __device__ void operator()() 
    { 
     int index = 0 ; 
     for(int i=0; i<= ImageHeight*ImageWidth*3 ; i = i+3) 
     { 
      BinaryImage[index]= ImageVector[i]; 
      index++; 
     } 
    } 
}; 

void main() 
{ 
    src = cvLoadImage("../Input/test.png", CV_LOAD_IMAGE_COLOR); 

    unsigned char *raw_ptr,*out_ptr; 
    raw_ptr = (unsigned char*) src->imageData; 

    thrust::device_ptr<unsigned char> dev_ptr = thrust::device_malloc<unsigned char>(ImageHeight*src->widthStep); 

    thrust::copy(raw_ptr,raw_ptr+(src->widthStep*ImageHeight),dev_ptr); 
    int index=0; 
    for(int j=0;j<ImageHeight;j++) 
    { 
     for(int i=0;i<ImageWidth;i++) 
     { 
      ImageVector[index] = (int) dev_ptr[ (j*src->widthStep) + (i*src->nChannels) + 0 ]; 
      ImageVector[index+1] = (int) dev_ptr[ (j*src->widthStep) + (i*src->nChannels) + 1 ]; 
      ImageVector[index+2] = (int) dev_ptr[ (j*src->widthStep) + (i*src->nChannels) + 2 ]; 

      index +=3 ; 
     } 
    } 

} 
+2

С кодом возникает ряд проблем. Прочитали ли вы [ускоренный быстрый старт] (https://github.com/thrust/thrust/wiki/Quick-Start-Guide) (как я ранее вам предлагал?) Есть примеры (например, саксофонный функтор), приведенный в там (и во многих других местах) использования определяемого пользователем функтора в коде тяги. [Вот пример] (http://stackoverflow.com/questions/15989178/cuda-thrust-reduce-by-key-on-only-some-values-in-an-array-based-off-values-in/15995193 # 15995193) Я написал, что может быть так, как вы пытаетесь сделать. Тем не менее, ваш функтор, вероятно, не нуждается в цикле в нем. –

+2

Вы также можете рассмотреть возможность исключения функтора и извлечения данных и просто использовать механизм доступа с широким диапазоном (https://github.com/thrust/thrust/blob/master /examples/strided_range.cu). –

+0

Я благодарю вас .. Я пробовал механизм доступа с широким диапазоном в моем коде, и он работает ... Но работает ли он внутри устройства? – user1891682

ответ

1

Поскольку изображение хранится в пиксельном формате, и каждый пиксель включает в себя различные цвета, существует естественный «шаг» в доступе отдельных цветовых компонент каждого пикселя. В этом случае кажется, что цветовые компоненты пикселя хранятся в трех последовательных int количествах на пиксель, поэтому шаг доступа для данного цветового компонента будет три.

Пример использования метода итератора доступа с ограниченным доступом охватывает here.

Смежные вопросы