在Matlab中有一个移位函数,用于执行矩阵的列或行的循环移位。 OpenCV中有类似的功能吗?
答案 0 :(得分: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
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
简短回答,不。
答案很长,如果确实需要,可以轻松实现,例如使用cv::Mat::row(i)
,cv::Mat::(cv::Range(rowRange), cv::Range(cv::colRange))
使用临时对象。
答案 3 :(得分:0)
或者,如果您使用的是Python,只需使用roll() method。