将4张打乱顺序的碎片拼接复原并展示原图
将x张碎片的左右边缘提取保存
左右边缘两两对比,将相似度超过预设阈值的碎片执行拼接操作,得到左右拼接好的碎片
提取左右拼接好的碎片的上下边缘
上下边缘两两对比,将相似度超过预设阈值的碎片执行拼接操作,得到原图
#include <opencv2/opencv.hpp>#include "opencv2/core/core.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <string>#include <cstdlib>#include <utility>#include <opencv2/imgproc/types_c.h>using namespace std;using namespace cv;/** 问题: 将x张打乱顺序的碎片复原,将复原好的图片展示出来* 思路: 1. 将x张碎片的左右边缘提取保存* 2. 左右边缘两两对比,将相似度超过预设阈值的碎片执行拼接操作,得到左右拼接好的碎片* 3. 提取左右拼接好的碎片的上下边缘* 4. 上下边缘两两对比,将相似度超过预设阈值的碎片执行拼接操作,得到原图*/int n = 0; //左右拼接时需要的迭代器int m = 0; //上下拼接时需要的迭代器//读取碎片vector<mat> fragments_imread(string files_name);vector<mat> fragments_lr_imread(string files_name); //读取左右拼接好的碎片//保存每张碎片的左右边缘vector <vector<mat>> edge_rection_lr(const vector <mat>& fragments);//直方图对比bool compare_by_hist(const mat& img1, const mat& img2);//左右拼接void picture_stitching_lr(const mat& img1, const mat& img2);//对每张碎片的左右边缘相互对比拼接void alignment_and_splicing_lr(const vector <mat>& fragments, const vector<vector<mat>>& rection_lr);//参数:碎片;碎片的左右边缘//保存每张碎片的上下边缘vector <vector<mat>> edge_rection_tb(const vector <mat>& fragments_lr);//上下拼接void picture_stitching_tb(const mat& img1, 表达方式有哪几种const mat& img2);//对左右拼接好的碎片进行上下对比拼接void alignment_and_splicing_tb(const vector <mat>& fragments_lr, const vector<vector<mat>>& rection_tb);int main() {vector<mat> fragments = fragments_imread("res/fragments/"); //读取碎片vector<vector<mat> > rection_lr = edge_rection_lr(fragments); //保存每张碎片的左右边缘alignment_and_splicing_lr(fragments,rection_lr); 苏轼 水调歌头 全诗 //对每张碎片的左右边缘相互对比拼接vector<mat> fragments_lr = fragments_lr_imread("res/fragments_lr/"); //读取左右拼接好的碎片vector<vector<mat>> rection_tb = edge_rection_tb(fragments_lr); //保存拼接好的左右碎片的上下边缘alignment_and_splicing_tb(fragments_lr, rection_tb); //对左右拼接好的碎片的上下边缘相互对比拼接mat result = imread("res/result/0.jpg");imshow("restoration map",result); //展示结果waitkey(0);return 0;}//读取碎片vector<mat> fragments_imread(string files_name){vector<string> files;glob(std::move(files_name),files);vector<mat> fragments;for(auto &file : files){fragments.push_back(imread(file));}return fragments;}vector<mat> fragments_lr_imread(string files_name){vector<string> files;glob(std::move(files_name),files);vector<mat> fragments_lr;for(auto &file : files){fragments_lr.push_back(imread(file));}return fragments_lr;}//保存每张碎片的左右边缘vector<vector<mat> > edge_rection_lr(const vector <mat>& fragments){vector<vector<mat> > rection_lr(fragments.size(), vector<mat>(2));for(int i = 0; i<fragments.size(); i++){for(int j = 0; j<2; j++){switch (j){ca 0: //第 i 张碎片的 左边; 顶点:(0,0) 尺寸:(10 * 第i张碎片的高/行)rection_lr.at(i).at(j) = fragments.at(i)(rect(0,0,10, fragments.at(i).rows));break;ca 1: //第 i 张碎片的 右边; 顶点:(第 i 张碎片的宽/列-10,0) 尺寸:(10 * 第i张碎片的高/行)rection_lr.at(i).at(j) = fragments.at(i)(rect(fragments.at(i).cols-10,0,10, fragments.at(i).rows));default:break;}}}return rection_lr;}//直方图对比bool compare_by_hist(const mat& img1, const mat& img2){mat tmpimg,orgimg;resize(img1, tmpimg, size(img1.cols, img1.rows));resize(img2, orgimg, size(img2.cols, img2.rows));//hsv颜色特征模型(色调h,饱和度s,亮度v)cvtcolor(tmpimg, tmpimg, color_bgr2hsv);cvtcolor(orgimg, orgimg, color_bgr2hsv);//直方图尺寸设置//一个灰度值可以设定一个bins,256个灰度值就可以设定256个bins//对应hsv格式,构建二维直方图//每个维度的直方图灰度值划分为256块进行统计,也可以使用其他值int hbins = 256, sbins = 256;int histsize[] = { hbins,sbins };//h:0~180, s:0~255,v:0~255//h色调取值范围float hranges[] = { 0, 180 };//s饱和度取值范围float sranges[] = { 0,255 };const float* ranges[] = { hranges, sranges };int channels[] = { 0,1 };//二维直方图matnd hist1, hist2;calchist(&tmpimg, 1, channels, mat(), hist1,2,histsize, ranges, true, fal);normalize(hist1, hist1, 0, 1, norm_minmax, -1, mat());calchist(&orgimg, 1, channels, mat(), hist2, 2, histsize, ranges, true, fal);normalize(hist2, hist2, 0, 1, norm_上下九步行街好玩吗minmax, -1, mat());double similarityvalue = comparehist(hist1, hist2, cv_comp_correl);// cout << "相似度:" << similarityvalue << endl;return similarityvalue >= 0.95;}//左右拼接void picture_stitching_lr(const mat& img1, const mat& img2){mat result;hconcat(img1,img2,result);imwrite("res/fragments_lr/"+to_string(n)+".jpg", result);n++;}//对每张碎片的左右边缘相互对比拼接void alignment_and_splicing_lr(const vector <mat>& fragments, const vector<vector<mat>>& rection_lr){for(int i = 0; i<fragments.size()-1; i++){ //第 i 张碎片for(int j = 0; j<2; j++){ //第 i 张碎片的第 j 条边for(int k = i; k<fragments.size()-1; k++){ //第 i 张碎片的第 j 条边 与 第 i 张以后碎片的左右边缘对比for(int l = 0; l<2; l++){if(compare_by_hist(rection_lr.at(i).at(j),rection_lr.at(k+1).at(l))){if(j>l){ //当j>l时被对比的边缘应该在对比右边picture_stitching_lr(fragments.at(i),fragments.at(k+1));} el if(j<l){ //当j<l时被对比的边缘应该在对比右边picture_stitching_lr(fragments.at(k+1),fragments.at(i));}}}}}}}//上下拼接void picture_stitching_tb(const mat&a举杯邀明月mp; img1, const mat& img2){mat result;vconcat(img1,img2,result);imwrite("res/result/"+to_string(m)+".jpg", result);m++;}//保存左右拼接好的碎片的上下边缘vector <vector<mat>> edge_rection_tb(const vector <mat>& fragments_lr){vector <vector<mat>> rection_tb(fragments_lr.size(), vector<mat>(2));for(int i = 0; i<fragments_lr.size(); i++){for(int j = 0; j<2; j++){switch (j){ca 0: //第 i 张碎片的 上边缘; 顶点:(0,0) 尺寸:(第i张碎片的宽/列 * 10)rection_tb.at(i).at(j) = fragments_lr.at(i)(rect(0,0,fragments_lr.at(i).cols, 10));break;ca入党誓词全文 1: //第 i 张碎片的 下边缘; 顶点:(0,第 i 张碎片的高/行-10) 尺寸:(第i张碎片的宽/列 * 10)rection_tb.at(i).at(j) = fragments_lr.at(i)(rect(0,fragments_lr.at(i).rows-10, fragments_lr.at(i).cols, 10));default:break;}}}return rection_tb;}//对左右拼接好的碎片进行上下对比拼接void alignment_and_splicing_tb(const vector <mat>& fragments_lr, const vector<vector<mat>>& rection_tb){for(int i = 0; i<fragments_lr.size()-1; i++){ //第 i 张碎片for(int j = 0; j<2; j++){ //第 i 张碎片的第 j 条边for(int k = i; k<fragments_lr.size()-1; k++){ //第 i 张碎片的第 j 条边 与 第 i 张以后碎片的左右边缘对比for(int l = 0; l<2; l++){if(compare_by_hist(rection_tb.at(i).at(j),rection_tb.at(k+1).at(l))){// picture_stitching_tb(fragments_lr.at(i),fragments_lr.at(k+1));if(j>l){ //当j>l时被对比的边缘应该在对比下边picture_stitching_tb(fragments_lr.at(i),fragments_lr.at(k+1));} el if(j<l){ //当j<l时被对比的边缘应该在对比上边picture_stitching_tb(fragments_lr.at(k+1),fragments_lr.at(i));}}}}}}}
碎片:
拼接结果:
到此这篇关于opencv实现乱序碎片复原的文章就介绍到这了,更多相关opencv碎片复原内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 05:31:15,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/81c9ea3fbbc1f19b6c109d9e79215e8c.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:OpenCV实现乱序碎片复原.doc
本文 PDF 下载地址:OpenCV实现乱序碎片复原.pdf
留言与评论(共有 0 条评论) |