MFC+Opencv拼图
本篇文章主要通过将一系列图片作为拼图的基础,实现目标图形的拼图,我们先给个结果图可以更直观了解生成的结果是如何的。
MFC对话框添加按钮
第一步:在对话框内创建按钮
第二步:在对话框里修改默认的ID: IDC_pingtu
第三步:双击所创建的按钮,会生成默认函数:
void picprocessing::OnBnClickedpingtu()
{
//空的
}
我们把实现写在内部即可!
图片准备
首先,整理好目标图片,确保名称命名要和代码的路径加载保持一致,这边以16张赫本的图片为基础
Opencv配置
这部分建议去查查资料,并不难但是需要有耐心,这边篇幅有限就不扯太多,去看看官网或者github帮助文档。
代码实现
void picprocessing::OnBnClickedpingtu()
{
const int N = 4;
const int NUM = N * N;// NUM 为图片数量
const int SIZE = N * 2000;
const int PIX = 100;
const int R1 = SIZE / PIX;
const int R = R1 / N * R1 / N;
Mat imgs[NUM];
for (int i = 1; i <= NUM; i++) {
imgs[i - 1] = imread("D:/pic2/1 - 副本 (" + to_string(i) + ") - 副本.jpg", 0);//拼图图片位置
resize(imgs[i - 1], imgs[i - 1], Size(PIX, PIX));
}
Mat img = imread("D:/pic2/1 - 副本 (1) - 副本.jpg", 0);//最终拼成的图片
resize(img, img, Size(SIZE, SIZE));
Nodes node[NUM * R];
Nodes node2[NUM * R];
for (int i = 0; i < NUM * R; i++) {
node[i].t = imageSum(imgs[i % NUM]);
node[i].id = i % NUM;
node2[i].t = imageSum(img(Rect(i % R1 * PIX, i / R1 * PIX, PIX, PIX)));
node2[i].id = i;
}
sort(node, node + NUM * R);
sort(node2, node2 + NUM * R);
for (int i = 0; i < NUM * R; i++)
{
Mat image;
imgs[node[i].id % NUM].copyTo(image);
image *= 1.0 * node2[i].t / node[i].t;
image.copyTo(img(Rect(node2[i].id % R1 * PIX, node2[i].id / R1 * PIX, PIX, PIX)));
}
//imshow("img", img);
imwrite("D:/pic2/dundun.png", img);//图片输出
cv::waitKey(0);
}
生成的结果如图所示: