我正在分析我开发的代码,当我使用 cvSet2D 时,我发现我的代码存在瓶颈。是否有比 cvSet2D 更有效的替代方法?
我怎样才能写出这些像素?
我建议您使用 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 倍。
有关迭代像素的不同方法的更多信息,请查看本教程。
您需要获取指向结构的数据字段的指针。
(C API) IplImage 结构有一个称为数据的 char* 字段。访问(your_type*)image->data
第一个元素,然后像常规的 C 1D 数组一样使用它,但要小心使用字段 stepWidth 从一行跳转到下一行(因为数据行可能会以 16 位的倍数对齐以进行内存访问优化)。
(C++ API)T* cv::Mat::ptr<T>(int i)
用于获取指向要访问的行的第一个元素的指针。然后用作常规 C++ 1D 数组。
这应该是更快的访问模式(有关不同访问模式的比较,请参阅 OpenCV2 Cookbook 一书)。