我有一个 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/