我正在分析我开发的代码,当我使用cvSet2D时,我发现代码中存在瓶颈。 是否有一些替代cvSet2D更有效?
我该怎么写这些像素?
答案 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一书)。