#include "CImageMerge.h" #include CImageMerge::CImageMerge() { } CImageMerge::~CImageMerge() { } cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight,int mode) { cv::Mat dst(srcMat.rows, srcMat.cols / (mode == 0 ? 1:3), CV_8UC(mode == 0 ? 1 : 3)); return dst; auto graymerge = [](cv::Mat& src,cv::Mat dst)->cv::Mat{ int width_block = src.cols / 12; int heigh_block = src.rows; // 20 vsp 拼接算法 // src(cv::Rect(width_block,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(0,0,width_block*2,heigh_block))); // src(cv::Rect(0,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*2,0,width_block,heigh_block))); // src(cv::Rect(width_block*3,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*4,0,width_block*2,heigh_block))); // src(cv::Rect(width_block*5,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*3,0,width_block,heigh_block))); // src(cv::Rect(width_block*7,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*6,0,width_block*2,heigh_block))); // src(cv::Rect(width_block*6,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*8,0,width_block,heigh_block))); // src(cv::Rect(width_block*9,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*10,0,width_block*2,heigh_block))); // src(cv::Rect(width_block*11,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*9,0,width_block,heigh_block))); //return dst; // 45 vsp 拼接算法 src(cv::Rect(0,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block,0,width_block*2,heigh_block))); src(cv::Rect(width_block*2,0,width_block,heigh_block)).copyTo(dst(cv::Rect(0,0,width_block,heigh_block))); src(cv::Rect(width_block*3,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*5,0,width_block,heigh_block))); src(cv::Rect(width_block*4,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*3,0,width_block*2,heigh_block))); src(cv::Rect(width_block*6,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*7,0,width_block*2,heigh_block))); src(cv::Rect(width_block*8,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*6,0,width_block,heigh_block))); src(cv::Rect(width_block*9,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*11,0,width_block,heigh_block))); src(cv::Rect(width_block*10,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*9,0,width_block*2,heigh_block))); return dst; }; //cv::imwrite("org.jpg",srcMat); if (!srcMat.empty()) { if(mode == 0)//灰度模式 return graymerge(srcMat,dst); std::vector ch_mats; int blockcnt = 12; int spitWidth = srcMat.cols / blockcnt; cv::Mat retMat(srcMat.rows, srcMat.cols / 3, CV_8UC3); for (int i = 0; i < 4; i++) { if (i < 2) { ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 2), 0, spitWidth, srcMat.rows))); ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 0), 0, spitWidth, srcMat.rows))); } else { ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 0), 0, spitWidth, srcMat.rows))); ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 2), 0, spitWidth, srcMat.rows))); } cv::merge(ch_mats, retMat(cv::Rect(spitWidth * i, 0, spitWidth, srcMat.rows))); ch_mats.clear(); } return graymerge(retMat,dst); } return srcMat; } cv::Mat CImageMerge::MergeImage(bool iscolor, cv::Mat &srcMat, int dstwidth, int dstheight) { int blockcnt = 12; int spitWidth = srcMat.cols / blockcnt; int abortwidth; // = spitWidth == 3888 ? 432 : (spitWidth == 2592 ? 216 : 144); if (!iscolor) // 灰度 { abortwidth = spitWidth == 1296 ? 432 : (spitWidth == 648 ? 216 : 144); } else { abortwidth = spitWidth == 3888 ? 432 : (spitWidth == 1944 ? 216 : 144); } cv::Mat dst(dstheight, dstwidth - abortwidth * 2, CV_8UC(iscolor ? 3 : 1)); if (!iscolor) { for (int i = 0; i < 2; i++) { srcMat(cv::Rect((dstwidth / 2 + abortwidth) * i, 0, dstwidth / 2 - abortwidth, dstheight)).copyTo(dst(cv::Rect(dst.cols / 2 * i, 0, dst.cols / 2, dstheight))); } srcMat.release(); return dst; } else { std::vector m_splits; std::vector m_index = {1, 4, 7, 10, 2, 5, 6, 9, 0, 3, 8, 11}; for (int i = 0; i < 3; i++) { int startindex = i == 0 ? 0 : (i == 1 ? 4 : 8); cv::Mat t_mat(dstheight, dstwidth - abortwidth * 2, CV_8UC1); srcMat(cv::Rect(spitWidth * m_index[startindex + 0], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(0, 0, spitWidth, dstheight))); srcMat(cv::Rect(spitWidth * m_index[startindex + 1], 0, spitWidth - abortwidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth, 0, spitWidth - abortwidth, dstheight))); srcMat(cv::Rect(spitWidth * m_index[startindex + 2] + abortwidth, 0, spitWidth - abortwidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 2 - abortwidth, 0, spitWidth - abortwidth, dstheight))); srcMat(cv::Rect(spitWidth * m_index[startindex + 3], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 3 - abortwidth * 2, 0, spitWidth, dstheight))); m_splits.push_back(t_mat); } cv::merge(m_splits, dst); m_splits.clear(); } srcMat.release(); return dst; } cv::Mat CImageMerge::MergeFrames(std::vector frames, int type, int dpi) { if (frames.empty()) return cv::Mat(); int size = frames.size(); auto it = frames.begin(); int dstH = it->rows * size; int abortwidth = dpi == 0x02 || dpi == 0x01 ? 432 : 864; // 216*2 432*2 int dstwidth = dpi == 0x02 || dpi == 0x01 ? 7344 : 14688; cv::Mat matdst(dstH, dstwidth, CV_8UC(type == 1 ? 3 : 1)); for (int i = 0; i < size; i++) { auto itemimg = frames[i]; itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows); itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows))); itemimg.release(); } return matdst; }