我在并行区域使用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。我的代码中有什么问题?任何帮助将不胜感激。
方面, 南
答案 0 :(得分:0)
几乎所有在Mat上运行的功能都会检查目标Mat的大小和类型。如果它们相同,则使用它们。所以,如果你使用
来限制Matthreshold(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
的混合?因为这会发生,至少在处理的某个时刻。
因此,如果给定的功能在适当的位置运行,并且它是否在感兴趣的区域上运行,以及它是否可以在感兴趣的区域上运行,则始终检查文档。并且还使用常识填补官方文档中缺失的空白。