75 lines
2.9 KiB
C++
75 lines
2.9 KiB
C++
|
#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<cv::Mat> 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,std::uint32_t fpga_vs)
|
||
|
{
|
||
|
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<cv::Mat> m_splits;
|
||
|
std::vector<int> 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;
|
||
|
}
|