将矢量分配给循环中的矩阵行的最快方法是什么?我想用矢量沿着它的行填充一个数据矩阵。这些向量是循环计算的。这个循环持续到数据矩阵的所有条目填充那些向量。Opencv Mat矢量分配到一个矩阵的行,最快的方式?
目前我正在使用cv::Mat::at<>()
方法来访问矩阵的元素并填充矢量,但看起来这个过程很慢。我尝试了另一种方式,使用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;
}
}
如果您确实想要访问单个ROW,它始终是连续的afaik。 – Micka 2014-09-23 09:39:17