2011-12-18 2 views
0

Я использую Mat::convertTo() в параллельной области, он не преобразует матричные данные в определенный тип. Но я тестировал другие функции, например. cv::threshold(), cv::imshow(). Он работает нормально. Я не знаю, что случилось. См. Мой код ниже:Mat :: convertTo не работает с OpenMP

// Mat dst is CV_32FC1 
    if(dst.type() != CV_8UC1) 
    { 
     int rows = dst.rows; 
     #pragma omp parallel num_threads(2) 
     { 
      int numt = omp_get_num_threads(); 
      int tid = omp_get_thread_num(); 
      int start = tid*(rows/numt); 
      int end = (tid+1)*(rows/numt); 
      if(tid == (numt-1)) 
      { 
       end = rows; 
      } 

      Mat tmp = dst.rowRange(start, end); 
      tmp.convertTo(tmp, CV_8UC1); 
    } 

Параллельная область выполнена, но тип dst по-прежнему CV_32FC1. В чем проблема в моем коде? Любая помощь будет оценена.

Regard, Nan

+1

Это не может работать, поскольку вы не меняете тип 'dst' в любом месте. В коде отсутствует также скобка. –

+0

Спасибо @macs, но я до сих пор не понимаю вашего предложения. Можете ли вы направить мне код или что-то еще? Поскольку 'Mat :: rowRange()' создает новый заголовок для диапазона строк 'dst'. Поэтому, если я конвертирую тип 'tmp', почему тип' dst' все еще старый. Извините за бессмысленный вопрос. Я новичок в opencv. :) –

+0

Это потому, что вы создаете копию 'dst.rowRange'. Таким образом, при изменении типа 'tmp' вы не меняете тип' dst'. Было бы также полезно, если бы вы предоставили еще один код. Сейчас алгоритм не имеет для меня никакого смысла. –

ответ

0

Почти все функции, работающие на проверку Мэта размер и тип назначения Мэта. Если они одинаковы, они используют их. Итак, если вы порог Mat с

threshold(src, src, ...); 

Он будет обработан на месте

Но, если коврик назначения различного размера, типа, количества каналов и т.д., это будет Alloc новенький. В вашем примере:

tmp.convertTo(tmp, CV_OTHER_TYPE); 

теперь вы предположить, что ДСТ, что на самом деле источником кручений, будет изменен:

dst(tmp_region_ofInterest).convertTo(dst(region)); 

Но на самом деле расширяется до

Mat tmp2(tmp.size, CV_OTHER_SIZE); 
tmp.convertTo(tmp2,...); 
tmp = tmp2; 

И после выхода функции ваш tmp больше не является регистром dst.

Причина проста: во-первых, вы не можете изменить тип на месте, и вы не можете изменить тип частичной матрицы. Что вы хотите? Имеют матрицу (непрерывное пространство в памяти), заполненную смесью unsigned char и float? Потому что это произойдет, по крайней мере, в какой-то момент при обработке.

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

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