我希望将给定ColumnVector的值右移并复制到比ColumnVector大一个元素的另一个RowVector上。我想通过将columnVector复制到RowVector内的某个范围来完成此操作。
// The given columnVector ( this code snippet is added to make the error reproducable)
int yDimLen = 26; // arbitrary value
cv::Mat columnVector(yDimLen, 1, CV_32SC1, cv::Scalar(13)); // one column AND yDimLen rows
for (int r = 0; r < yDimLen; r++) // chech the values
{
printf("%d\t", *(columnVector.ptr<int>(r)));
}
// Copy elemnets of columnVector to rowVector starting from column number 1
cv::Mat rowVector(1, yDimLen + 1, CV_32SC1, cv::Scalar(0));
cv::Mat rowVector_rangeHeader = rowVector.colRange(cv::Range(1, yDimLen + 1)); // header matrix, 1 in included AND (yDimLen + 1) is excluded
columnVector.copyTo(rowVector_rangeHeader);
// check the values
printf("\n---------------------------------\n");
for (int c = 0; c < yDimLen; c++)
{
printf("%d\t", rowVector_rangeHeader.ptr<int>(0)[c]); // displays 13
}
printf("\n---------------------------------\n");
for (int c = 0; c < yDimLen + 1; c++)
{
printf("%d\t", rowVector.ptr<int>(0)[c]); // displays 0 !!!
}
header 矩阵是否指向包含rowVector的相同内存地址?如果没有,如何将数据复制到行的某些部分?
最佳答案
从the docs of cv::Mat::copyTo
:
只要目标的形状或数据类型与源不匹配,就需要重新分配。您的情况就是形状。为了演示这一点,让我们在copyTo
调用周围添加一些跟踪:
std::cout << "Shapes involved in `copyTo`:\n";
std::cout << "Source: " << columnVector.size() << "\n";
std::cout << "Destination: " << rowVector_rangeHeader.size() << "\n";
columnVector.copyTo(rowVector_rangeHeader);
std::cout << "After the `copyTo`:\n";
std::cout << "Destination: " << rowVector_rangeHeader.size() << "\n";
输出:
Shapes involved in `copyTo`:
Source: [1 x 26]
Destination: [26 x 1]
After the `copyTo`:
Destination: [1 x 26]
解决方案很简单-
reshape
源匹配目标。columnVector.reshape(1, 1).copyTo(rowVector_rangeHeader);
现在我们得到以下输出:
Shapes involved in `copyTo`:
Source: [1 x 26]
Destination: [26 x 1]
After the `copyTo`:
Destination: [26 x 1]
和
rowVector
的内容如下:[0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13]
作为替代方案,您可以只将
std::copy
与MatIterator
一起使用。std::copy(columnVector.begin<int>()
, columnVector.end<int>()
, rowVector_rangeHeader.begin<int>());
rowVector
的内容与以前相同:[0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13]