簡體   English   中英

Mat :: convertTo不適用於OpenMP

[英]Mat::convertTo does not work with OpenMP

我在並行區域中使用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。 我的代碼有什么問題? 任何幫助將不勝感激。

問候,南

Mat上幾乎所有操作的功能都會檢查目標Mat的大小和類型。 如果它們相同,則使用它們。 因此,如果您使用

threshold(src, src, ...);

它將就地處理

但是,如果目標墊的大小,類型,通道數等不同,它將分配一個新的墊。 在您的示例中:

tmp.convertTo(tmp, CV_OTHER_TYPE);

現在您假設實際上是tpm的源的dst將被更改:

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

但實際上它擴展為

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

函數退出后,您的tmp不再是dst區域。

原因很簡單:首先,您不能就地更改類型,也不能更改部分矩陣的類型。 你想發生什么? 是否有矩陣(內存中的連續空間)充滿了unsigned charfloat的混合體? 因為這種情況至少在處理的某個時候會發生。

因此,請始終在文檔中檢查給定功能是否在適當的地方運行,是否在感興趣的區域中運行以及是否可以在感興趣的區域中就地運行。 並使用常識來填補官方文檔中缺少的空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM