我想在OpenCV中创建一个双通道矩阵,其值是对应的行和列索引对。我可以通过以下方式轻松做到这一点:
for (int i = 0 ; i< img_height ; ++ i){
for (int j = 0 ; j < img_width ; ++ j){
src.ptr<Point2f>(i)[j] = Point2f(j,i);
}
}
我想知道 OpenCV 中是否有一种方法可以更快、更紧凑的方式初始化这样的矩阵,而不必使用这种元素方法。我搜索了文档,但没有找到任何可以帮助我达到此目的的东西。
我之所以这么问,是因为我确实需要我的应用程序更快,所以我正在寻找可以在我的代码上应用的任何可能的改进。
提前致谢
这没有内置函数。您最终可以使用重复来模拟 Matlab 函数meshgrid
,但在这种情况下会慢得多。
但是,您可以改进一些方面:
- 从内部循环中获取指向行首的指针,因为每行的指针都是相同的。
- 避免创建临时对象来存储值。
- 我想你交换了 i 和 j。
看看这个代码:
Mat2f src(img_height, img_width);
for (int i = 0; i < img_height; ++i) {
Vec2f* ptr = src.ptr<Vec2f>(i);
for (int j = 0; j < img_width; ++j) {
ptr[j][0] = i;
ptr[j][1] = j;
}
}
这个片段有点快(以毫秒为单位的时间):
@MarcoFerro: 1.22755
@Miki: 0.818491
测试代码:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
int img_height = 480;
int img_width = 640;
{
Mat2f src(img_height, img_width);
double tic = double(getTickCount());
for (int i = 0; i< img_height; ++i){
for (int j = 0; j < img_width; ++j){
src.ptr<Point2f>(i)[j] = Point2f(i, j);
}
}
double toc = (double(getTickCount()) - tic) * 1000.0 / getTickFrequency();
cout << "@MarcoFerro: t" << toc << endl;
}
{
Mat2f src(img_height, img_width);
double tic = double(getTickCount());
for (int i = 0; i < img_height; ++i) {
Vec2f* ptr = src.ptr<Vec2f>(i);
for (int j = 0; j < img_width; ++j) {
ptr[j][0] = i;
ptr[j][1] = j;
}
}
double toc = (double(getTickCount()) - tic) * 1000.0 / getTickFrequency();
cout << "@Miki: tt" << toc << endl;
}
getchar();
return 0;
}