#include "CImageMerge.h" CImageMerge::CImageMerge() { } CImageMerge::~CImageMerge() { } cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight) { cv::Mat retMat(dstheight, dstwidth, CV_8UC3); if (!srcMat.empty()) { std::vector ch_mats; int blockcnt = 12; int spitWidth = srcMat.cols / blockcnt; for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { std::cout << " index " << (i * 3 + j) << " x " << spitWidth * (i * 3 + j) << " y " << 0 << " width " << spitWidth << " height " << dstheight << std::endl; ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + j), 0, spitWidth, dstheight))); } cv::merge(ch_mats, retMat(cv::Rect(spitWidth * i, 0, spitWidth, dstheight))); ch_mats.clear(); } return retMat; } } cv::Mat CImageMerge::MergeImage(bool iscolor, cv::Mat &srcMat, int dstwidth, int dstheight, unsigned int fgpaversion) { if (fgpaversion == 0x00090002) { int blockcnt = iscolor ? 18 : 6; int spitWidth = srcMat.cols / blockcnt / 2; //一面的灰度图像宽度 int abortwidth = spitWidth == 1296 ? 432 : (spitWidth == 648 ? 216 : 144); std::cout << "image is color " << iscolor << std::endl; cv::Mat dst(dstheight, dstwidth - 2 * abortwidth, CV_8UC(iscolor ? 3 : 1)); if (!iscolor) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 6; j++) { int index = i == 0 ? 5 : 11; int bandindex = (i * 6 + j); if (bandindex == 0 || bandindex == 11) { if (bandindex == 0) srcMat(cv::Rect(bandindex * spitWidth, 0, spitWidth - abortwidth, srcMat.rows)).copyTo(dst(cv::Rect(spitWidth * (index - j), 0, spitWidth - abortwidth, srcMat.rows))); else srcMat(cv::Rect(bandindex * spitWidth + abortwidth, 0, spitWidth - abortwidth, srcMat.rows)).copyTo(dst(cv::Rect(spitWidth * (index - j) - abortwidth, 0, spitWidth - abortwidth, srcMat.rows))); } else { if (bandindex >= 6) srcMat(cv::Rect(bandindex * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(dst(cv::Rect(spitWidth * (index - j) - 2 * abortwidth, 0, spitWidth, srcMat.rows))); else srcMat(cv::Rect(bandindex * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(dst(cv::Rect(spitWidth * (index - j), 0, spitWidth, srcMat.rows))); } } } srcMat.release(); } else { std::vector m_splits = { cv::Mat(dstheight, dstwidth - 2 * abortwidth, CV_8UC1), cv::Mat(dstheight, dstwidth - 2 * abortwidth, CV_8UC1), cv::Mat(dstheight, dstwidth - 2 * abortwidth, CV_8UC1)}; int item_index[3][4] = { {11, 2, 35, 26}, // R {17, 8, 29, 20}, // B {14, 5, 32, 23} // G }; for (size_t j = 0; j < 3; j++) { // Front srcMat(cv::Rect((item_index[j][0] - 0) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 0, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][0] - 1) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 1, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][0] - 2) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 2, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][1] - 0) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 3, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][1] - 1) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 4, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][1] - 2) * spitWidth, 0, spitWidth - abortwidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 5, 0, spitWidth - abortwidth, srcMat.rows))); // Back srcMat(cv::Rect((item_index[j][2] - 0) * spitWidth + abortwidth, 0, spitWidth - abortwidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 6 - abortwidth, 0, spitWidth - abortwidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][2] - 1) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 7 - 2 * abortwidth, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][2] - 2) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 8 - 2 * abortwidth, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][3] - 0) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 9 - 2 * abortwidth, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][3] - 1) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 10 - 2 * abortwidth, 0, spitWidth, srcMat.rows))); srcMat(cv::Rect((item_index[j][3] - 2) * spitWidth, 0, spitWidth, srcMat.rows)).copyTo(m_splits[j](cv::Rect(spitWidth * 11 - 2 * abortwidth, 0, spitWidth, srcMat.rows))); } cv::merge(m_splits, dst); m_splits.clear(); } srcMat.release(); // static int index=0; // cv::imwrite(std::to_string(++index)+".bmp",dst); return dst; } else if(fgpaversion == 0x00090001) { 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(); } else { std::vector m_splits; std::vector m_index = {0, 3, 8, 11, 2, 5, 6, 9, 1, 4, 7, 10}; 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; } else if(fgpaversion == 0x0009000a) { auto switchblock = [](std::vector> v,cv::Mat& src,cv::Mat& dst,int block_width,int block_height,int abortwidth){ int copyindex =0; for(int i=0;i> v {{3,0},{5,1},{4,2},{1,3},{0,4},{2,5},{10,6},{9,7},{11,8},{6,9},{8,10},{7,11}}; if(!iscolor) { int abortwidth = srcMat.cols /12 == 1296 ? 432 :( srcMat.cols /12== 648 ? 216 :144); cv::Mat dst(srcMat.rows, srcMat.cols - abortwidth*2, CV_8UC1); switchblock(v,srcMat,dst,srcMat.cols /12,srcMat.rows,abortwidth); return dst; } else { cv::Mat retMat(srcMat.rows, srcMat.cols / 3, CV_8UC3); int spitWidth = srcMat.cols / 12 ; for(int i=0;i<4;i++) { // 1 2 0 std::vector ch_mats; if(i < 2){ 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))); ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); } else { 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))); ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); } cv::merge(ch_mats, retMat(cv::Rect(spitWidth * i, 0, spitWidth, srcMat.rows))); ch_mats.clear(); } int abortwidth = retMat.cols /12 == 1296 ? 432 :(retMat.cols /12 == 648 ? 216 :144); cv::Mat dst(retMat.rows, retMat.cols - abortwidth*2, CV_8UC3); switchblock(v,retMat,dst,retMat.cols /12,retMat.rows,abortwidth); printf(" dst.cols = %d dst.rows = %d dst.channels = %d \n",dst.cols,dst.rows,dst.channels()); return dst; } } return srcMat; }