Mat :: convertTo不适用于OpenMP

时间:2011-12-18 15:00:29

标签: c++ opencv 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。我的代码中有什么问题?任何帮助将不胜感激。

方面, 南

1 个答案:

答案 0 :(得分:0)

几乎所有在Mat上运行的功能都会检查目标Mat的大小和类型。如果它们相同,则使用它们。所以,如果你使用

来限制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 charfloat的混合?因为这会发生,至少在处理的某个时刻。

因此,如果给定的功能在适当的位置运行,并且它是否在感兴趣的区域上运行,以及它是否可以在感兴趣的区域上运行,则始终检查文档。并且还使用常识填补官方文档中缺失的空白。