Mat :: convertTo не работает с OpenMP - PullRequest
0 голосов
/ 18 декабря 2011

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

    // 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 Ответ

0 голосов
/ 19 декабря 2011

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

threshold(src, src, ...);

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

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

tmp.convertTo(tmp, CV_OTHER_TYPE);

теперь вы предполагаете, что dst, который на самом деле является источником tpm, будет изменен:

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

Но он фактически расширяется до

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...