cvSet2D的有效替代方案?

时间:2012-04-25 08:33:47

标签: c++ opencv

我正在分析我开发的代码,当我使用cvSet2D时,我发现代码中存在瓶颈。 是否有一些替代cvSet2D更有效?

我该怎么写这些像素?

2 个答案:

答案 0 :(得分:1)

我建议你使用C ++函数而不是旧的C风格函数。

写入像素的最有效方法如下:

   cv::Mat frame;

   // load your img to your Mat

   uchar* p = frame.ptr(row); // returns a row pointer
   p[column] = x; // accesses value in the given column

需要注意的一点是,您的列数可能超过像素列数,例如在3通道图像上,您可以访问实际像素列数的3倍。

有关迭代像素的不同方法的更多信息,请查看this教程。

答案 1 :(得分:0)

您需要获取指向结构数据字段的指针。

(C API)IplImage结构有一个名为data的char *字段。访问第一个元素(your_type*)image->data,然后像常规C 1D数组一样使用它,但要小心使用字段stepWidth从一行跳到下一行(因为数据行可以在16的倍数上对齐用于内存访问优化的位。)

(C ++ API)使用T* cv::Mat::ptr<T>(int i)获取指向要访问的行的第一个元素的指针。然后用作常规C ++ 1D数组。

这应该是更快的访问模式(有关不同访问模式的比较,请参阅OpenCV2 Cookbook一书)。