|
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "GlobalFunc.h"
|
|
|
|
|
|
|
|
|
|
#include "Markup.h"
|
|
|
|
|
|
|
|
|
|
#include "OpencvImgShell.h" // opencv֧<76><D6A7>
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
#include "QB_ImgProcessFun.h"
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ŀ¼
|
|
|
|
|
CString GetSoftwareCurrentDirectory()
|
|
|
|
|
{
|
|
|
|
|
char exeFullPath[MAX_PATH];
|
|
|
|
|
GetModuleFileName(NULL, exeFullPath, MAX_PATH);
|
|
|
|
|
|
|
|
|
|
CString Directy;
|
|
|
|
|
Directy.Format("%s", exeFullPath);
|
|
|
|
|
|
|
|
|
|
int index = Directy.ReverseFind('\\');
|
|
|
|
|
Directy.Delete(index, Directy.GetLength() - index);
|
|
|
|
|
|
|
|
|
|
return Directy;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
bool SearchDirectory(const CString &strDir)
|
|
|
|
|
{
|
|
|
|
|
CFileFind fileFind;
|
|
|
|
|
|
|
|
|
|
if (fileFind.FindFile(strDir))
|
|
|
|
|
{
|
|
|
|
|
fileFind.Close();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
fileFind.Close();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>¡<EFBFBD>鱨<EFBFBD><E9B1A8><EFBFBD><EFBFBD>
|
|
|
|
|
void CloneQBData(const QBStru &src, QBStru &dst)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>dst<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
ReleaseQBData(&dst);
|
|
|
|
|
|
|
|
|
|
dst.framePart = src.framePart;
|
|
|
|
|
// dst.frameAll = src.frameAll;
|
|
|
|
|
|
|
|
|
|
// <20><>2<EFBFBD><32>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
|
|
|
|
if (src.image.bValid == true) // ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|
|
|
|
{
|
|
|
|
|
dst.image.bValid = true;
|
|
|
|
|
CloneImgStru(src.image.srcImg, dst.image.srcImg);
|
|
|
|
|
CloneImgStru(src.image.dstImg, dst.image.dstImg);
|
|
|
|
|
CloneImgStru(src.image.geoImg, dst.image.geoImg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>¡ͼ<C2A1><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void CloneImgStru(const ImgStru &src, ImgStru &dst)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (src.ImgWidth > 0 && src.ImgHeight > 0 && (src.bitcount == 24 || src.bitcount == 8) && src.buff != nullptr)
|
|
|
|
|
{
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>
|
|
|
|
|
dst.ImgWidth = src.ImgWidth;
|
|
|
|
|
dst.ImgHeight = src.ImgHeight;
|
|
|
|
|
dst.bitcount = src.bitcount;
|
|
|
|
|
dst.BoundingBox = src.BoundingBox;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
|
|
|
|
SAFE_DELETE_ARRAY(dst.buff);
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
int lineByte = (dst.ImgWidth * dst.bitcount / 8);
|
|
|
|
|
|
|
|
|
|
// λͼ<CEBB><CDBC><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>С
|
|
|
|
|
int imgBufSize = dst.ImgHeight * lineByte;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
|
|
|
|
|
if (imgBufSize > 0)
|
|
|
|
|
{
|
|
|
|
|
dst.buff = new BYTE[imgBufSize];
|
|
|
|
|
|
|
|
|
|
if (dst.buff != NULL)
|
|
|
|
|
{
|
|
|
|
|
memcpy(dst.buff, src.buff, static_cast<size_t>(imgBufSize)); // ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3>ͷ<EFBFBD><CDB7>鱨<EFBFBD><E9B1A8><EFBFBD><EFBFBD>
|
|
|
|
|
void ReleaseQBData(QBStru *pQBData)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// ָ<><D6B8>Ϊ<EFBFBD><CEAA><EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (pQBData != NULL)
|
|
|
|
|
{
|
|
|
|
|
SAFE_DELETE_ARRAY(pQBData->image.srcImg.buff);
|
|
|
|
|
SAFE_DELETE_ARRAY(pQBData->image.dstImg.buff);
|
|
|
|
|
SAFE_DELETE_ARRAY(pQBData->image.geoImg.buff);
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>
|
|
|
|
|
memset(pQBData, 0, sizeof(QBStru));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ת<EFBFBD><D7AA>ƽ<EFBFBD><C6BD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
POINT RotateShiftPoint(const POINT &src, double angle, const POINT &shift)
|
|
|
|
|
{
|
|
|
|
|
POINT dst;
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
angle = angle/180.0 * 3.1415926535;
|
|
|
|
|
|
|
|
|
|
// <20><>ת
|
|
|
|
|
dst.x = static_cast<LONG>(src.x * cos(angle) - src.y * sin(angle) + 0.5);
|
|
|
|
|
dst.y = static_cast<LONG>(src.x * sin(angle) + src.y * cos(angle) + 0.5);
|
|
|
|
|
|
|
|
|
|
// ƽ<><C6BD>
|
|
|
|
|
dst.x += shift.x;
|
|
|
|
|
dst.y += shift.y;
|
|
|
|
|
|
|
|
|
|
return dst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ֱ+ˮƽ<CBAE><C6BD>ת ImgStru<72>е<EFBFBD> ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD>룺img<6D><67>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>תǰ
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>img<6D><67>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>ת<EFBFBD><D7AA>
|
|
|
|
|
void FlipImgStru(ImgStru* img)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><>Ч<EFBFBD><D0A7><EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (img == NULL ||
|
|
|
|
|
img->ImgWidth <= 0 ||
|
|
|
|
|
img->ImgHeight <= 0 ||
|
|
|
|
|
img->bitcount <=0 ||
|
|
|
|
|
img->buff == NULL)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (img->bitcount != 8 && img->bitcount != 24)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
|
|
|
|
|
int imgWidth = img->ImgWidth;
|
|
|
|
|
int imgHeight = img->ImgHeight;
|
|
|
|
|
int nBitCount = img->bitcount;
|
|
|
|
|
|
|
|
|
|
// <20>ڴ渴<DAB4>ƻ<EFBFBD><C6BB><EFBFBD>
|
|
|
|
|
int realLineByte = (imgWidth * nBitCount / 8);
|
|
|
|
|
|
|
|
|
|
cv::Mat src;
|
|
|
|
|
|
|
|
|
|
if (nBitCount == 8)
|
|
|
|
|
{
|
|
|
|
|
src = cv::Mat(imgHeight, imgWidth, CV_8UC1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
src = cv::Mat(imgHeight, imgWidth, CV_8UC3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// λͼ<CEBB><CDBC><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>С
|
|
|
|
|
int imgBufSize = imgHeight * realLineByte;
|
|
|
|
|
|
|
|
|
|
memcpy(src.data, img->buff, imgBufSize); // ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
|
|
|
|
|
|
|
|
|
cv::flip(src, src, 0);
|
|
|
|
|
|
|
|
|
|
memcpy(img->buff, src.data, imgBufSize); // ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|