需要一种更快的方法将cv :: Mat转换为1维矢量形式

时间:2014-07-28 18:28:37

标签: c++ performance opencv matrix linear-algebra

我有一个for循环,取一个n x n维的OpenCV Mat对象,并返回一个n ^ 2 x 1维的Mat对象。它可以工作,但是当我计算方法时,它需要1到2毫秒。因为我把这个方法称为3到4百万次,所以我的程序运行大约一个小时。我正在引用的一篇研究论文表明,作者能够生成一个具有相同功能的程序,只需几分钟即可运行,而无需并行运行任何线程。在对每段代码进行计时之后,采用> 1 ms的唯一部分是以下方法。

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矩阵(或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);

2 个答案:

答案 0 :(得分:9)

假设您的Mat中的数据是连续的,Mat::reshape()表示胜利。

它几乎是免费的。只调整行/列,不移动内存。即,mat = mat.reshape(1,1)会生成一个1d浮点数组。

答案 1 :(得分:0)

在OpenCV 3.2中看到这一点,但该功能现在是mat.reshape(1)