OpenCV加速了Mat迭代
OpenCV speed up Mat iteration
我需要在 HSV 色彩空间中迭代 3 通道矩阵,但它非常慢。大约需要2.5秒。
cv::Mat img = cv::imread( "image.jpg" );
cv::Mat img32FC3;
img.convertTo( img32FC3, CV_32FC3 );
cv::cvtColor( img32FC3, img32FC3, CV_BGR2HSV );
int height = img32FC3.rows;
int width = img32FC3.cols;
cv::Size size = img32FC3.size();
if( img32FC3.isContinuous() ) {
size.width *= size.height;
size.height = 1;
}
size.width *= 3;
for( int i = 0; i < size.height; i ++ ) {
float* ptr = img32FC3.ptr<float>(i);
for( int j = 0; j < size.width; j += 3 ) {
h = (ptr[ j ]);
s = (ptr[j +1 ]);
v = (ptr[j +2 ]);
}
}
cv::cvtColor( img32FC3, img32FC3, CV_HSV2BGR );
img32FC3.convertTo( img, CV_8UC3 );
imwrite("test.jpg", img );
上面的代码改编自 openCV 的文档,其中声明它是高性能的。所以我想知道我如何加快速度,因为 2.5 秒真的非常非常慢:(。
顺便说一句:图像是 3744x5616 像素
您不应该直接访问垫子的数据,因为有时它不会像您期望的那样存储。在这里查看我的答案。
另一种方法是使用垫子迭代器。根据[opencv_tutorials.pdf,版本2.4.2,第89-92页]它比我链接中的嵌套循环略慢。(对于大图像,您慢了 5%,但请注意,他们只使用了 MatIterator,而不是可以通过一个漂亮的编译器进一步优化的 const 函数。
MatConstIterator_<Vec3b> it = M.begin<Vec3b>(), it_end = M.end<Vec3b>();
for(; it != it_end; ++it)
{
//do sth read-only otherwise use MatIterator_<Vec3b>
b = (*it)[0];
g = (*it)[1];
r = (*it)[2];
}
<double>
如果是灰度,来自 OCV2.4.2 refman p19。
加快速度的最佳方法是并行化循环。OpenCV使用TBB作为多线程环境,你可能想要检查它。顺便说一句,您无需对大小等进行所有计算。你已经检查了你的矩阵是连续(),所以你可以得到指针作为float ptr = reinterpret_cast<float>(img32FC3.data)
然后你的循环:
for (size_t i = ; i < img32FC3.rows*img32FC3.cols; ++i, ptr +=3) {
// do something
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- 迭代 CalcHist 返回的 Mat
- OpenCV加速了Mat迭代
- 创建一个cv::Mat的小列表并对其进行迭代的正确方法是什么
- 在使用 Mat::at 迭代图像时崩溃
- 为什么我对 cv::Mat 迭代器的分配不起作用