c++ - 需要一种更快的方法将 cv::Mat 转换为一维 vector 形式

标签 c++ performance opencv matrix linear-algebra

我有一个 for 循环,它接受一个 n x n 维的 OpenCV Mat 对象,并返回一个 n^2 x 1 维的 Mat 对象。它有效,但是当我为该方法计时时,它需要 1 到 2 毫秒。由于我调用此方法 3 或 4 百万次,因此我的程序需要大约一个小时才能运行。我引用的一篇研究论文表明,作者能够生成一个具有相同功能的程序,该程序仅需几分钟即可运行,而无需并行运行任何线程。在对每一段代码进行计时后,唯一花费 >1 毫秒的部分是以下方法。

static Mat mat2vec(Mat mat)
{

Mat toReturn = Mat(mat.rows*mat.cols, 1, mat.type());
float* matPt;
float* retPt;
for (int i = 0; i < mat.rows; i++) //rows
    {
        matPt = mat.ptr<float>(i);
        for (int j = 0; j < mat.row(i).cols; j++) //col
        {
            retPt = toReturn.ptr<float>(i*mat.cols + j);
            retPt[0] = matPt[j];
        }
    }
return toReturn;
}

有什么方法可以提高此方法将 n x n 矩阵转换为 n^2 x 1 矩阵(或表示 vector 的 cv::Mat)的速度?

这解决了@berak 的大部分问题,它现在运行得更快了。但是在某些情况下,如下所示,垫子不是连续的。知道如何在连续垫中获得投资返回率吗?

我的方法不是这样的:

static Mat mat2vec(Mat mat)
{
if ( ! mat.isContinuous() )
{ 
    mat = mat.clone();
}
return mat.reshape(1,2500);
}

问题发生在:

Mat patch = Mat(inputSource, Rect((inputPoint.x - (patchSize / 2)), (inputPoint.y -        (patchSize / 2)), patchSize, patchSize));
Mat puVec = mat2vec(patch);

最佳答案

假设你的 Mat 中的数据是连续的,Mat::reshape()为了胜利。

而且几乎是免费的。只有行/列得到调整,没有移动内存。即,mat = mat.reshape(1,1) 会生成一个一维 float 组。

关于c++ - 需要一种更快的方法将 cv::Mat 转换为一维 vector 形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25001842/

相关文章:

performance - HBase:为什么在达到 BlockCache 的最大大小之前会有被逐出的 block ?

opencv - 如何在ROS中使用OpenCV 4?

C++ 函数返回引用

performance - 最大化数组中成对距离的总和

c++ - 队列不是模板

C++:在 vector 中插入什么 - 指针或引用, vector 何时复制其元素?

iphone - 在Xcode中找不到-lstdc++的库

matlab - 是否有直接执行一维数据插值的函数(查表)

c++ - 连接字符串和数字

c++ - 如何跨指针保持 const 正确性?