[英]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 char
和float
的混合体? 因为这种情况至少在处理的某个时候会发生。
因此,请始终在文档中检查给定功能是否在适当的地方运行,是否在感兴趣的区域中运行以及是否可以在感兴趣的区域中就地运行。 并使用常识来填补官方文档中缺少的空白。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.