可以刪除無用的行和列,以及工作在矩陣與原矩陣大小的一半。
您可以用resize
功能做到這一點很容易,與最近的插值:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
Mat1b mat = (Mat1b(4,4) << 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15);
Mat1b res;
resize(mat, res, Size(0, 0), 0.5, 0.5, INTER_NEAREST);
cout << "Mat:" << endl << mat << endl << endl;
cout << "Res:" << endl << res << endl;
return 0;
}
然後在res
的值僅在索引中的值,你需要:
Mat:
[0, 1, 2, 3;
4, 5, 6, 7;
8, 9, 10, 11;
12, 13, 14, 15]
Res:
[0, 2;
8, 10]
爲了將值恢復到原始位置,可以使用Kronecker產品(在OpenCV中不可用,但可以是easily implemented)和suita ble模式。這將產生:
Mat:
[0, 1, 2, 3;
4, 5, 6, 7;
8, 9, 10, 11;
12, 13, 14, 15]
Res:
[0, 2;
8, 10]
Res Modified:
[1, 3;
9, 11]
Restored:
[1, 0, 3, 0;
0, 0, 0, 0;
9, 0, 11, 0;
0, 0, 0, 0]
代碼:
#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>
using namespace cv;
using namespace std;
Mat kron(const Mat A, const Mat B)
{
CV_Assert(A.channels() == 1 && B.channels() == 1);
Mat1d Ad, Bd;
A.convertTo(Ad, CV_64F);
B.convertTo(Bd, CV_64F);
Mat1d Kd(Ad.rows * Bd.rows, Ad.cols * Bd.cols, 0.0);
for (int ra = 0; ra < Ad.rows; ++ra)
{
for (int ca = 0; ca < Ad.cols; ++ca)
{
Kd(Range(ra*Bd.rows, (ra + 1)*Bd.rows), Range(ca*Bd.cols, (ca + 1)*Bd.cols)) = Bd.mul(Ad(ra, ca));
}
}
Mat K;
Kd.convertTo(K, A.type());
return K;
}
int main(int argc, char **argv)
{
Mat1b mat = (Mat1b(4, 4) << 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15);
Mat1b res;
resize(mat, res, Size(0, 0), 0.5, 0.5, INTER_NEAREST);
cout << "Mat:" << endl << mat << endl << endl;
cout << "Res:" << endl << res << endl << endl;
// Work on Res
res += 1;
cout << "Res Modified:" << endl << res << endl << endl;
// Define the pattern
Mat1b pattern = (Mat1b(2,2) << 1, 0,
0, 0);
// Apply Kronecker product
Mat1b restored = kron(res, pattern);
cout << "Restored:" << endl << restored << endl << endl;
return 0;
}
使我懷疑這是OP的擺在首位用意何在?有點輪重新發明,但從來沒有傷害任何人:) –
非常感謝。這是一個非常好的解決方案。如果我能以某種方式得到一個只有索引[0,2; 8,10]非零的4 * 4矩陣,其餘的都是零。例如經過其他操作'res = [1,9; 5,7];'我想讓這些值在4 * 4矩陣中的位置,其餘爲零。最新的矩陣將是'[1,0,9,0; 0,0,0,0; 5,0,7,0; 0,0,0,0]'。這將加快肯定,但我有點貪婪:) – smttsp
@sm我不明白,請你詳細說明,請? – Miki