在 Matlab 中有一个移位函数,用于执行矩阵的列或行的循环移位。OpenCV中有类似的功能吗?
问问题
5757 次
4 回答
4
我正在寻找同样的问题,但由于没有,我自己写的。这是另一种选择。在我的代码中,您可以向右或向左移动 n 次:对于left numRight is -n, right +n
.
void shiftCol(Mat& out, Mat in, int numRight){
if(numRight == 0){
in.copyTo(out);
return;
}
int ncols = in.cols;
int nrows = in.rows;
out = Mat::zeros(in.size(), in.type());
numRight = numRight%ncols;
if(numRight < 0)
numRight = ncols+numRight;
in(cv::Rect(ncols-numRight,0, numRight,nrows)).copyTo(out(cv::Rect(0,0,numRight,nrows)));
in(cv::Rect(0,0, ncols-numRight,nrows)).copyTo(out(cv::Rect(numRight,0,ncols-numRight,nrows)));
}
希望这会对某些人有所帮助。类似地,shiftRows 可以写成
于 2013-08-28T13:16:37.887 回答
2
这是我对循环矩阵移位的实现。欢迎任何建议。
//circular shift one row from up to down
void shiftRows(Mat& mat) {
Mat temp;
Mat m;
int k = (mat.rows-1);
mat.row(k).copyTo(temp);
for(; k > 0 ; k-- ) {
m = mat.row(k);
mat.row(k-1).copyTo(m);
}
m = mat.row(0);
temp.copyTo(m);
}
//circular shift n rows from up to down if n > 0, -n rows from down to up if n < 0
void shiftRows(Mat& mat,int n) {
if( n < 0 ) {
n = -n;
flip(mat,mat,0);
for(int k=0; k < n;k++) {
shiftRows(mat);
}
flip(mat,mat,0);
} else {
for(int k=0; k < n;k++) {
shiftRows(mat);
}
}
}
//circular shift n columns from left to right if n > 0, -n columns from right to left if n < 0
void shiftCols(Mat& mat, int n) {
if(n < 0){
n = -n;
flip(mat,mat,1);
transpose(mat,mat);
shiftRows(mat,n);
transpose(mat,mat);
flip(mat,mat,1);
} else {
transpose(mat,mat);
shiftRows(mat,n);
transpose(mat,mat);
}
}
于 2012-05-09T14:14:46.457 回答
0
简短的回答,不。
长答案,如果您真的需要它,您可以轻松实现它,例如使用临时对象使用cv::Mat::row(i)
, cv::Mat::(cv::Range(rowRange), cv::Range(cv::colRange))
。
于 2012-05-02T20:39:31.143 回答
0
或者,如果您使用的是 Python,只需使用roll() 方法。
于 2012-05-02T21:59:45.133 回答