【发布时间】:2016-02-18 17:59:05
【问题描述】:
我的任务是定期更新r 行和c 列中的cv::Mat m,方式如下:
- 按
1列将整个m向右移动,删除位置c-1的最后一列 - 在
0位置随机生成新列 - 刷新
m的剧情
为了清楚起见,这将产生一种带式输送机模拟。但是,当m 必须移动时,问题出现在第 1 点。
我找到了两种不同的解决方案,分别是 A 和 B,两者的结果相同。这表明我做错了什么。
方法A如下:
int offset = 1;
cv::Mat tmp = cv::Mat::zeros(m.size(), m.type());
cv::Rect rect_src(0, 0, m.cols-offset, m.rows);
cv::Rect rect_dst(offset, 0, m.cols-offset, m.rows);
cv::Mat in = m(rect_src);
cv::Mat out = tmp(rect_dst);
in.copyTo(out);
m = temp;
方法B如下:
int offset = 1;
cv::Mat trans_mat = (cv::Mat_<double>(2, 3) << 1, 0, offset, 0, 1, 0);
cv::Mat warped;
warpAffine(m, warped, trans_mat, m.size());
m = warped;
下面是作为示例的输出小m(左侧产生随机值):
周期 1
90 0 0 0 0 0 0 0 0
143 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
周期 2
0 0 90 0 0 0 0 0 0
0 0 143 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
周期 3
0 0 144 0 90 0 0 0 0
0 0 161 0 143 0 0 0 0
0 0 0 0 0 0 0 0 0
很明显,一个由零组成的额外列以某种方式出现......我真的不知道如何。
附:如果我设置offset = 3,则输出会按系数2 缩放,依此类推。
90 0 0 0 0 0 0 0 0
143 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
周期 2
0 0 0 0 0 0 90 0 0
0 0 0 0 0 0 143 0 0
0 0 0 0 0 0 0 0 0
【问题讨论】:
标签: c++ opencv opencv-mat