OpenCV 转换慢

Posted

技术标签:

【中文标题】OpenCV 转换慢【英文标题】:OpenCV convertTo slow 【发布时间】:2012-12-14 19:51:41 【问题描述】:

我有一张cv::Mat fooImage 1000*1000 像素的CV_32F 格式的图像。

现在我想显示图像,我使用

fooImage.convertTo(displayImage,CV_8UC1)

但是,仅此行大约需要 5 毫秒。这正常吗??如何快速将CV_32F Mat 图像转换为CV_8UC1

谢谢!

【问题讨论】:

英特尔至强 CPU E5-2690 windows 7 64 位 将 400 万字节转换为 100 万字节的不同格式被认为是慢的时候到了。您预计执行此操作需要多长时间?我怀疑 OpenCV 对你来说太慢了。此外,请务必非常准确地测量这些时间。 虽然 float 到 int 的转换很慢,但您列出的时间对应于超过 10.000 个周期/转换 - 这不可能。因此,您要么测量错误,要么您的构建不是发布模式,或者其他错误 请注意,这不仅仅是拿 4 个红苹果并将其随机转换为 1 个橙色给您的朋友的问题,您必须尽可能地用一个 1 个绿色的苹果来表示这 4 个苹果苹果(因为你喜欢你的朋友,就这么说吧)。这样做的一种方法是考虑所有原始的一百万个苹果,找到最大的一个,最小的一个,减去这些大小,将其提高到 -1 并乘以 2^(APPLE-BIT-DEPTH)。如果您非常了解您的苹果,您可以简化此操作,但仍需要对每个苹果进行基本转换,这样您的朋友就会得到青苹果。 re @mmpg:我预计不到 1 毫秒...我使用了 time.h,clock_t,time1 = clock();计算时间。 【参考方案1】:

这听起来很慢,但 convertTo() 可能并不是特别适合使用 SSE2 或任何东西。

您正在从 RAM 中读取 4Mb,分配 1Mb,执行 400 万次浮点运算并将 1Mb 写回 RAM,因此毫秒不是不合理的。

您可以编写一个简单的循环,自己将图像数据转换为 uchar,只需将每个值乘以 255.0

您是否包括显示图像的时间?您正在创建一个仍然是 8 位灰度的“displayImage”,它必须在显示时转换为 RGB 或 RGBA 图像

【讨论】:

我看不出将每个值乘以 255 是如何正确的。你当然不能用无符号字节表示 424242.424242 * 255。 我猜 Martin 假设这些值在区间 [0.0f,1.0f] 内,因为这是按照惯例存储浮点图像的方式。 谢谢@Martin Beckett,由于您的 cmets,我的问题得到了解决,但 convertTo 的问题仍未解决。一开始我只是想显示图片,结果发现函数imshow,如果是CV_32F,会自动将图片缩放255,所以我想把它转换成CV_8UC1。根据你的cmets,我把所有的CV_32F图像除以255,然后直接用imshow,就可以显示图像了。因此保存了 convertTo 的 5ms。但我仍然不明白为什么一个简单的转换可能需要 5 毫秒.... 这 5ms 不包括显示。它是这样的: time1 = clock(); fooImage.convertTo(displayImage,CV_8UC1);时间2 =时钟();时间 = time2-time1. @UserKiwi,imshow() 只是调用 convertTo()。如果你关心你可以做更多的计时测试,可能是 clock() 每 5ms 只更新一次它的答案 - 尝试在循环中调用 convertTo() 100x 和时间

以上是关于OpenCV 转换慢的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenCV Rect 转换为 dlib 矩形?

OpenCV这么简单为啥不学——1.9cvtColor颜色空间转换(全色值效果演示)

linux下cmake编译opencv 为啥这么慢

Python+OpenCV数字图像处理,彩色空间变换(HSI和RGB空间转换)

OpenCV + OS X + 外部网络摄像头 = 非常慢

OpenCV 前景检测慢