c++ - 双 channel cv::Mat 对象填充了 row-col 索引,没有 for 循环

标签 c++ opencv mat

我想在 OpenCV 中创建一个双 channel 矩阵,其值是对应的行和列索引对。我可以通过以下方式轻松做到这一点:

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 中是否有一种方法可以更快、更紧凑地初始化这样的矩阵,而不必使用这种逐元素的方法。我搜索了文档,但没有找到任何可以帮助我实现此目的的内容。

我问这个是因为我确实需要我的应用程序更快,所以我正在寻找可以应用到我的代码的任何可能的改进。

提前致谢

最佳答案

对此没有内置函数。您最终可以使用 repeat 模拟 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: \t\t" << toc << endl;
    }

    getchar();
    return 0;
}

关于c++ - 双 channel cv::Mat 对象填充了 row-col 索引,没有 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35062732/

相关文章:

opencv - findHomography后如何知道透视变换矩阵

C++ 对象 block 分配与单独分配

c++ - 没有调用构造函数?

c++ - 我正在更改我的代码,但编译后的程序没有受到影响

c++ - QT Creator C++ 和运行时库

python - 是否可以在不同线程上为不同图像运行 knnMatch?

opencv - 如何识别图像中的真实正方形

iphone - opencv在iPhone中获取子图像

c++ - How to?: 将cv::Mat定义为类成员,然后在源代码文件中修改它

c++ - OpenCV - 套接字接收到失真图像