You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
3.9 KiB
C++

2 years ago
#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;
}
}