c++ - Opencv Mat vector 分配给矩阵的一行,最快的方法?

标签 c++ opencv matrix

在循环中将 vector 分配给矩阵行的最快方法是什么?我想用 vector 沿其行填充一个数据矩阵。这些 vector 在循环中计算。这个循环一直持续到 data matrix 的所有条目都填满了这些 vector 。

目前我正在使用 cv::Mat::at<>()访问矩阵元素并用 vector 填充它们的方法,但是,这个过程似乎很慢。我通过使用 cv::Mat::X.row(index) = data_vector 尝试了另一种方式, 它运行速度很快但填充了我的矩阵 X有一些我无法理解的垃圾值,为什么。

我读到还有另一种使用指针的方法(最快的方法),但是,我无法理解。有人可以解释如何使用它们或其他不同的方法吗?

这是我的部分代码:

#define OFFSET 2

cv::Mat im = cv::imread("001.png", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat X = cv::Mat((im.rows - 2*OFFSET)*(im.cols - 2*OFFSET), 25, CV_64FC1); // Holds the training data. Data contains image patches
cv::Mat patch = cv::Mat(5, 5, im.type()); // Holds a cropped image patch
typedef cv::Vec<float, 25> Vec25f;

int ind = 0;
for (int row = 0; row < (im.rows - 2*OFFSET); row++){
    for (int col = 0; col < (im.cols - 2*OFFSET); col++){

    cv::Mat temp_patch = im(cv::Rect(col, row, 5, 5)); // crop an image patch (5x5) at each pixel
    patch = temp_patch.clone(); // Needs to do this because temp_patch is not continuous in memory 
    patch.convertTo(patch, CV_64FC1);

    Vec25f data_vector = patch.reshape(0, 1); // make it row vector (1X25).
    for (int i = 0; i < 25; i++) 
    {
        X.at<float>(ind, i) = data_vector[i]; // Currently I am using this way (quite slow).
    }

    //X_train.row(ind) = patch.reshape(0, 1); // Tried this but it assigns some garbage values to the data matrix!
    ind += 1;
    }
}

最佳答案

要按照常规的 opencv 方式进行操作:-

ImageMat.row(RowIndex) = RowMat.clone();

RowMat.copyTo(ImageMat.row(RowIndex));

尚未测试正确性或速度。

关于c++ - Opencv Mat vector 分配给矩阵的一行,最快的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25991236/

相关文章:

c++ - 用 Big-O Notation 计算我的程序的算法复杂度

c++ - 找不到 opencv naclport 构建输出

python - 检测噪声图像中几乎恒定颜色的垂直矩形

python - 将正整数矩阵转换为无循环的 bool 矩阵

c# - 在 C# 中存储矩阵值的快速且有用的方法

c++ - gcc 可以使我的代码并行吗?

c++ - 在参数化虚拟中会发生什么?

python - 如何通过opencv匹配纸张

c++ - OpenCV 中的多 channel 或多列矩阵

c++ - 使用模板实现通用字符串解析器