需要一个更快的方式来转换cv::Mat成一维矢量形式
Need a faster way to convert a cv::Mat into 1 dimensional vector form
我有一个for循环,它接受n x n维的OpenCV Mat对象,并返回n^2 x 1维的Mat对象。它可以工作,但是当我计时方法时,它需要1到2毫秒。因为我调用这个方法三百万或四百万次,所以我的程序运行大约需要一个小时。我引用的一篇研究论文表明,作者能够编写一个具有相同功能的程序,该程序仅在几分钟内运行,而无需并行运行任何线程。在对每段代码进行计时后,下面的方法是唯一耗时> 1ms的部分。
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,它现在运行得快多了。然而,在某些情况下,如下面,垫不是连续的。你知道我怎样才能在一个连续的垫子上获得ROI吗?
我的方法不是这样的:
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::重塑()获胜。
而且几乎是免费的。只有行/cols得到调整,没有内存移动。也就是说,mat = mat.reshape(1,1)
将它作为一个1d浮点数组。
在OpenCV 3.2中看到这个,但函数现在是mat.reshape(1)
相关文章:
- 将CHW格式的浮点向量转换为cv::Mat
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 将 cv::Mat 转换为 std::vector 的通用函数
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- 如何将 cv::Mat & Img 复制到未签名的 char* img?opencv
- 如何将 cv::Mat 转换为 vtkImageData?
- 如何将 vtkImageData 转换为 cv::Mat?
- 如何总结所有cv::Mat元素
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 在 cv::Mat 中生成 2D 坐标网格
- 将 cv::Mat 转换为无符号的 int 像素
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 如何将多个 cv::Mat 从 c++ dll 传递到 opencvsharp Mat c#?
- OpenCV(3.4.1) 错误:断言失败(变暗 <= 2 && step[0] > 0) in cv::Mat::locateROI
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何使用 (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors)
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?