mirror of http://192.168.1.51:8099/lmh188/twain3.0
扫描协议扩展
This commit is contained in:
parent
67d296fdc9
commit
a9ae29134d
|
@ -85,7 +85,7 @@ BOOL CTwainUI::OnInitDialog()
|
||||||
UpdateUI();
|
UpdateUI();
|
||||||
UpdateListConfig();
|
UpdateListConfig();
|
||||||
dataChangeFunction();
|
dataChangeFunction();
|
||||||
//setvisable_size(false);
|
setvisable_size(false);
|
||||||
#ifdef G200
|
#ifdef G200
|
||||||
setvisable_sleepmode(false);
|
setvisable_sleepmode(false);
|
||||||
#endif // G200
|
#endif // G200
|
||||||
|
|
|
@ -246,7 +246,6 @@ void GScanO1003399::config_params(GScanCap& param)
|
||||||
|
|
||||||
cfg.g200params.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
|
cfg.g200params.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0;
|
||||||
cfg.g200params.unused_one = cfg.g200params.sizeerror_errorratio = 0;
|
cfg.g200params.unused_one = cfg.g200params.sizeerror_errorratio = 0;
|
||||||
param.resolution_dst >= 240.0f ? 1 : 0;
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -271,12 +270,12 @@ void GScanO1003399::config_params(GScanCap& param)
|
||||||
cfg.g400params.reversed1 = cfg.g400params.reversed2 = 0;
|
cfg.g400params.reversed1 = cfg.g400params.reversed2 = 0;
|
||||||
#endif // G200
|
#endif // G200
|
||||||
config_scanparam(cfg);
|
config_scanparam(cfg);
|
||||||
config_imgprocparam({0});
|
config_imgprocparam({sizeof(GScanCap_3399)});
|
||||||
GScanCap_3399 param39{ 0 };
|
GScanCap_3399 param39{ 0 };
|
||||||
param39.AutoCrop_threshold = param.AutoCrop_threshold;
|
param39.AutoCrop_threshold = param.AutoCrop_threshold;
|
||||||
param39.autodescrew = param.autodescrew;
|
param39.autodescrew = param.autodescrew;
|
||||||
param39.automaticcolor = param.automaticcolor;
|
param39.automaticcolor = param.automaticcolor;
|
||||||
param39.automaticcolortype = param39.automaticcolortype;
|
param39.automaticcolortype = param.automaticcolortype;
|
||||||
param39.brightness = param.brightness;
|
param39.brightness = param.brightness;
|
||||||
param39.contrast = param.contrast;
|
param39.contrast = param.contrast;
|
||||||
param39.detachnoise = param.detachnoise;
|
param39.detachnoise = param.detachnoise;
|
||||||
|
@ -312,6 +311,8 @@ void GScanO1003399::config_params(GScanCap& param)
|
||||||
param39.scannum = param.scannum;
|
param39.scannum = param.scannum;
|
||||||
param39.sharpen = param.sharpen;
|
param39.sharpen = param.sharpen;
|
||||||
param39.threshold = param.threshold;
|
param39.threshold = param.threshold;
|
||||||
|
param39.multiOutput = MultiOutput::Unused;
|
||||||
|
param39.normalCrop = param.normalCrop;
|
||||||
m_usb->write_bulk(¶m39, sizeof(param39));
|
m_usb->write_bulk(¶m39, sizeof(param39));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -688,7 +689,7 @@ int GScanO1003399::read_data(void* data, int length, int timeout)
|
||||||
StopWatch sw;
|
StopWatch sw;
|
||||||
FileTools::writelog(log_INFO, "read_data timeout =" + to_string(timeout));
|
FileTools::writelog(log_INFO, "read_data timeout =" + to_string(timeout));
|
||||||
while (readed < length) {
|
while (readed < length) {
|
||||||
if (sw.elapsed_ms() < timeout)
|
if (sw.elapsed_ms() < timeout &&m_usb.get())
|
||||||
{
|
{
|
||||||
reading = std::max(0, std::min(length - readed, buffer_size));
|
reading = std::max(0, std::min(length - readed, buffer_size));
|
||||||
reading = m_usb->read_bulk((unsigned char*)data + readed, reading);
|
reading = m_usb->read_bulk((unsigned char*)data + readed, reading);
|
||||||
|
|
|
@ -439,6 +439,11 @@ void ImageMatQueue::proc()
|
||||||
|
|
||||||
while (bRun)
|
while (bRun)
|
||||||
{
|
{
|
||||||
|
if (m_imagedata.Size() > 0)
|
||||||
|
{
|
||||||
|
this_thread::sleep_for(chrono::milliseconds(10));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
string msg;
|
string msg;
|
||||||
auto info = m_imgCacheinfo.Take();
|
auto info = m_imgCacheinfo.Take();
|
||||||
if (info.path.length() == 0 || !isFileExist(info.path))
|
if (info.path.length() == 0 || !isFileExist(info.path))
|
||||||
|
@ -571,10 +576,14 @@ void ImageMatQueue::proc()
|
||||||
mats[j].release();
|
mats[j].release();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!mats[j].empty())
|
||||||
|
{
|
||||||
cv::Mat mergeOrgin_UV = ImageApplyUV::Apply(mats[j], uvmats[j], rects[j], isDesaskew, angleResults.size() > 0 ? angleResults[j] : 0, scanParam.pixtype);
|
cv::Mat mergeOrgin_UV = ImageApplyUV::Apply(mats[j], uvmats[j], rects[j], isDesaskew, angleResults.size() > 0 ? angleResults[j] : 0, scanParam.pixtype);
|
||||||
if (!mergeOrgin_UV.empty())
|
if (!mergeOrgin_UV.empty())
|
||||||
mats[j] = mergeOrgin_UV;
|
mats[j] = mergeOrgin_UV;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
rects.clear();
|
||||||
uvmats.clear();
|
uvmats.clear();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
setBmpInfoHeader(mat, res);
|
setBmpInfoHeader(mat, res);
|
||||||
//uchar* data = m_data->data() + headersize + bmpdatasize;
|
//uchar* data = m_data->data() + headersize + bmpdatasize;
|
||||||
//uchar* matdata = mat.data;
|
//uchar* matdata = mat.data;
|
||||||
//for (int i = 0; i < mat.rows; i++){
|
//for (int i = 0; i < mat.rows; i++) {
|
||||||
// data -= m_datalinesize;
|
// data -= m_datalinesize;
|
||||||
// memcpy(data, matdata, step);
|
// memcpy(data, matdata, step);
|
||||||
// matdata += step;
|
// matdata += step;
|
||||||
|
|
|
@ -146,7 +146,7 @@ typedef struct tagCONFIGINFO
|
||||||
|
|
||||||
typedef struct tagFillHole
|
typedef struct tagFillHole
|
||||||
{
|
{
|
||||||
byte is_fillhole;
|
uint8_t is_fillhole;
|
||||||
int fillholeratio;
|
int fillholeratio;
|
||||||
}FillHole;
|
}FillHole;
|
||||||
|
|
||||||
|
@ -181,6 +181,12 @@ typedef struct tagHARDWAREPARAMS
|
||||||
#endif
|
#endif
|
||||||
}HardwareCaps;
|
}HardwareCaps;
|
||||||
|
|
||||||
|
typedef struct tagSkew_Detection {
|
||||||
|
uint8_t enable;
|
||||||
|
int level;
|
||||||
|
}SkewDetection;
|
||||||
|
|
||||||
|
|
||||||
typedef struct Scan_Rect {
|
typedef struct Scan_Rect {
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
|
@ -188,7 +194,7 @@ typedef struct Scan_Rect {
|
||||||
int y;
|
int y;
|
||||||
}ScanRect;
|
}ScanRect;
|
||||||
|
|
||||||
enum PaperAlign :uint8_t {
|
enum PaperAlign :unsigned char {
|
||||||
Rot0 = 0,
|
Rot0 = 0,
|
||||||
Rot270 = 3,
|
Rot270 = 3,
|
||||||
AutoTextOrientation = 5
|
AutoTextOrientation = 5
|
||||||
|
@ -259,6 +265,23 @@ struct GScanCap
|
||||||
std::string SavePath;
|
std::string SavePath;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct tagCrop_Rect
|
||||||
|
{
|
||||||
|
int enable;
|
||||||
|
int x; /*****自定义裁切区域左上角x坐标*/
|
||||||
|
int y; /*****自定义裁切区域左上角y坐标*/
|
||||||
|
int width; /*****自定义裁切区域宽度*******/
|
||||||
|
int height; /*****自定义裁切区域高度*******/
|
||||||
|
}CropRect;
|
||||||
|
|
||||||
|
typedef enum tagMulti_Output {
|
||||||
|
Unused = -1,
|
||||||
|
All,
|
||||||
|
ColorGray,
|
||||||
|
ColorBw,
|
||||||
|
GrayBw
|
||||||
|
}MultiOutput;
|
||||||
|
|
||||||
|
|
||||||
struct GScanCap_3399
|
struct GScanCap_3399
|
||||||
{
|
{
|
||||||
|
@ -302,6 +325,17 @@ struct GScanCap_3399
|
||||||
FillHole fillhole;
|
FillHole fillhole;
|
||||||
DetachNoise detachnoise; /**< 黑白降噪*/
|
DetachNoise detachnoise; /**< 黑白降噪*/
|
||||||
uint8_t is_autotext; /**< 自动文本方向识别*/
|
uint8_t is_autotext; /**< 自动文本方向识别*/
|
||||||
|
bool isfillcolor; /**< 自动裁切颜色填充>*/
|
||||||
|
int refuseInflow; /**< 防止渗透>*/
|
||||||
|
int colorCorrection; /**< 色彩校正>*/
|
||||||
|
int removeMorr; /**< 去除摩尔纹>*/
|
||||||
|
int errorExtention; /** < 错误扩散>*/
|
||||||
|
int textureRemove; /** < 除网纹>*/
|
||||||
|
int splitImage; /** < 图像拆分>*/
|
||||||
|
CropRect cropRect; /**< 自定义裁切>*/
|
||||||
|
MultiOutput multiOutput; /**< 多流输出>*/
|
||||||
|
bool normalCrop; /**< 自动裁切深色样张>*/
|
||||||
|
uint32_t reserve[1024]; /**< 预留4096字节做协议扩展*/
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Paper_Status {
|
typedef struct Paper_Status {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "ImageApplyAutoCrop.h"
|
#include "ImageApplyAutoCrop.h"
|
||||||
#include "ImageProcess_Public.h"
|
#include "ImageProcess_Public.h"
|
||||||
|
|
||||||
CImageApplyAutoCrop::CImageApplyAutoCrop()
|
CImageApplyAutoCrop::CImageApplyAutoCrop()
|
||||||
|
@ -33,16 +33,88 @@ CImageApplyAutoCrop::~CImageApplyAutoCrop()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cv::Mat concatenateMatrix(const cv::Mat& first, const cv::Mat& second)
|
||||||
|
{
|
||||||
|
cv::Mat mul1 = cv::Mat::eye(3, 3, CV_64F);
|
||||||
|
cv::Mat mul2 = cv::Mat::eye(3, 3, CV_64F);
|
||||||
|
cv::Mat mul_r;
|
||||||
|
first.convertTo(mul_r, CV_64F);
|
||||||
|
mul_r.row(0).copyTo(mul1.row(0));
|
||||||
|
mul_r.row(1).copyTo(mul1.row(1));
|
||||||
|
|
||||||
|
second.convertTo(mul_r, CV_64F);
|
||||||
|
mul_r.row(0).copyTo(mul2.row(0));
|
||||||
|
mul_r.row(1).copyTo(mul2.row(1));
|
||||||
|
|
||||||
|
mul1 = mul2 * mul1;
|
||||||
|
mul_r = first.clone();
|
||||||
|
mul1.row(0).copyTo(mul_r.row(0));
|
||||||
|
mul1.row(1).copyTo(mul_r.row(1));
|
||||||
|
return mul_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<cv::Mat> comMat()
|
||||||
|
{
|
||||||
|
std::vector<cv::Mat> mats;
|
||||||
|
cv::Point2f srcTri[3];
|
||||||
|
srcTri[0] = cv::Point2f(1, 1);
|
||||||
|
srcTri[1] = cv::Point2f(1, 0);
|
||||||
|
srcTri[2] = cv::Point2f(0, 1);
|
||||||
|
const float fact = 0.1f;
|
||||||
|
|
||||||
|
float pos[] = { 0, 2 * fact, fact };
|
||||||
|
cv::Point2f dstTri[3];
|
||||||
|
dstTri[0] = cv::Point2f(1, 1);
|
||||||
|
dstTri[1] = cv::Point2f(1, 0.5);
|
||||||
|
dstTri[2] = cv::Point2f(0, 1);
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
dstTri[0] = cv::Point2f(1, 1 + pos[i]);
|
||||||
|
dstTri[1] = cv::Point2f(1, pos[i]);
|
||||||
|
dstTri[2] = cv::Point2f(0, 1 + pos[i]);
|
||||||
|
|
||||||
|
mats.push_back(cv::getAffineTransform(srcTri, dstTri));
|
||||||
|
}
|
||||||
|
return mats;
|
||||||
|
}
|
||||||
|
|
||||||
|
void brightSharp(cv::Mat& src)
|
||||||
|
{
|
||||||
|
const float a = -0.49f;
|
||||||
|
const float b = 3.0f;
|
||||||
|
//float kernel_data[] = {
|
||||||
|
// a, 0, 0, 0, a,
|
||||||
|
// 0, 0, a, 0, 0,
|
||||||
|
// 0, a, b, a, 0,
|
||||||
|
// 0, 0, a, 0, 0,
|
||||||
|
// a, 0, 0, 0, a };
|
||||||
|
|
||||||
|
float kernel_data[] = {
|
||||||
|
0, a, 0,
|
||||||
|
a, b, a,
|
||||||
|
0, a, 0
|
||||||
|
};
|
||||||
|
cv::Mat kernel(3, 3, CV_32FC1, kernel_data);
|
||||||
|
cv::filter2D(src, src, src.depth(), kernel);
|
||||||
|
}
|
||||||
|
|
||||||
void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
{
|
{
|
||||||
(void)side;
|
(void)side;
|
||||||
if (pDib.empty()) return;
|
if (pDib.empty()) return;
|
||||||
if (!m_isCrop && !m_isDesaskew && !m_isFillBlank && m_normalCrop/* && m_fixedSize.empty()*/)
|
|
||||||
|
if (m_normalCrop)
|
||||||
{
|
{
|
||||||
pDib = pDib(cv::Rect((pDib.cols - m_fixedSize.width) / 2, side == 0 ? 75 : 145, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows)).clone();
|
cv::Rect roi = cv::Rect((pDib.cols - m_fixedSize.width) / 2, side == 0 ? 75 : 145, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows);
|
||||||
|
pDib = pDib(roi).clone();
|
||||||
|
m_rect = cv::RotatedRect(cv::Point2f(roi.x + roi.width / 2, roi.y + roi.height / 2), cv::Size2f(roi.width, roi.height), 0.0f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!m_isCrop && !m_isDesaskew && !m_isFillBlank && m_fixedSize.empty()) return;
|
||||||
|
|
||||||
cv::Mat src = pDib;
|
cv::Mat src = pDib;
|
||||||
cv::Mat thre;
|
cv::Mat thre;
|
||||||
cv::Mat dst;
|
cv::Mat dst;
|
||||||
|
@ -62,7 +134,7 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
if (m_maxContour.size() == 0)
|
if (m_maxContour.size() == 0)
|
||||||
{
|
{
|
||||||
thre.release();
|
thre.release();
|
||||||
//如果是固定幅面,须返回裁切后的尺寸
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹ̶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>棬<EFBFBD>뷵<EFBFBD>ز<EFBFBD><EFBFBD>к<EFBFBD>ijߴ<EFBFBD>
|
||||||
if (!m_isCrop)
|
if (!m_isCrop)
|
||||||
pDib = pDib(cv::Rect((pDib.cols - m_fixedSize.width) / 2, (pDib.rows - m_fixedSize.height) / 2, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows)).clone();
|
pDib = pDib(cv::Rect((pDib.cols - m_fixedSize.width) / 2, (pDib.rows - m_fixedSize.height) / 2, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows)).clone();
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
|
@ -75,7 +147,6 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
|
|
||||||
cv::RotatedRect rect = hg::getBoundingRect(m_maxContour);
|
cv::RotatedRect rect = hg::getBoundingRect(m_maxContour);
|
||||||
m_rect = rect;
|
m_rect = rect;
|
||||||
|
|
||||||
cv::Rect boudingRect = cv::boundingRect(m_maxContour);
|
cv::Rect boudingRect = cv::boundingRect(m_maxContour);
|
||||||
boudingRect.x -= 1;
|
boudingRect.x -= 1;
|
||||||
boudingRect.y -= 1;
|
boudingRect.y -= 1;
|
||||||
|
@ -84,30 +155,76 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
|
|
||||||
if (m_isDesaskew && rect.angle != 0)
|
if (m_isDesaskew && rect.angle != 0)
|
||||||
{
|
{
|
||||||
cv::Point2f srcTri[4];
|
cv::Point2f srcTri[4], srcTri_temp[3], dstTri[3];
|
||||||
cv::Point2f dstTri[3];
|
|
||||||
rect.points(srcTri);
|
rect.points(srcTri);
|
||||||
for (cv::Point2f& p : srcTri)
|
|
||||||
{
|
|
||||||
p.x -= 0.5;
|
|
||||||
p.y -= 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
dstTri[0] = cv::Point2f(0, rect.size.height - 1);
|
dstTri[0] = cv::Point2f(0, rect.size.height - 1);
|
||||||
dstTri[1] = cv::Point2f(0, 0);
|
dstTri[1] = cv::Point2f(0, 0);
|
||||||
dstTri[2] = cv::Point2f(rect.size.width - 1, 0);
|
dstTri[2] = cv::Point2f(rect.size.width - 1, 0);
|
||||||
|
|
||||||
|
srcTri_temp[0] = dstTri[0];
|
||||||
|
srcTri_temp[1] = dstTri[1];
|
||||||
|
srcTri_temp[2] = dstTri[2];
|
||||||
cv::Mat warp_mat;
|
cv::Mat warp_mat;
|
||||||
warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
||||||
|
if (src.channels() == 1)
|
||||||
|
{
|
||||||
cv::warpAffine(src, dst, warp_mat, rect.size, cv::INTER_LINEAR);
|
cv::warpAffine(src, dst, warp_mat, rect.size, cv::INTER_LINEAR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
dst = src(boudingRect & cv::Rect(0, 0, src.cols, src.rows));
|
{
|
||||||
|
cv::Mat bgr[3];
|
||||||
|
cv::split(src, bgr);
|
||||||
|
auto mats = comMat();
|
||||||
|
warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
||||||
|
warp_mat = concatenateMatrix(mats[0], warp_mat);
|
||||||
|
//warp_mat = mats[0];
|
||||||
|
|
||||||
m_maxContour.clear();
|
cv::warpAffine(bgr[0], bgr[0], warp_mat, rect.size, cv::INTER_LINEAR);
|
||||||
m_maxContour.push_back(cv::Point(-1, dst.rows));
|
|
||||||
m_maxContour.push_back(cv::Point(-1, -1));
|
warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
||||||
m_maxContour.push_back(cv::Point(dst.cols, -1));
|
warp_mat = concatenateMatrix(mats[1], warp_mat);
|
||||||
m_maxContour.push_back(cv::Point(dst.cols, dst.rows));
|
//warp_mat = mats[1];
|
||||||
|
cv::warpAffine(bgr[1], bgr[1], warp_mat, rect.size, cv::INTER_LINEAR);
|
||||||
|
|
||||||
|
warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
||||||
|
warp_mat = concatenateMatrix(mats[2], warp_mat);
|
||||||
|
//warp_mat = mats[2];
|
||||||
|
cv::warpAffine(bgr[2], bgr[2], warp_mat, rect.size, cv::INTER_LINEAR);
|
||||||
|
|
||||||
|
cv::merge(bgr, 3, dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
double* ptr_m = reinterpret_cast<double*>(warp_mat.data);
|
||||||
|
double a = ptr_m[0];
|
||||||
|
double b = ptr_m[1];
|
||||||
|
double c = ptr_m[2];
|
||||||
|
double d = ptr_m[3];
|
||||||
|
double e = ptr_m[4];
|
||||||
|
double f = ptr_m[5];
|
||||||
|
|
||||||
|
for (cv::Point& p : m_maxContour)
|
||||||
|
{
|
||||||
|
p.x = static_cast<int>(a * p.x + b * p.y + c);
|
||||||
|
p.y = static_cast<int>(d * p.x + e * p.y + f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto t_rect = boudingRect & cv::Rect(0, 0, src.cols, src.rows);
|
||||||
|
dst = src(t_rect);
|
||||||
|
if (dst.channels() == 3)
|
||||||
|
{
|
||||||
|
cv::Mat bgr[3];
|
||||||
|
cv::split(dst, bgr);
|
||||||
|
auto mats = comMat();
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
cv::warpAffine(bgr[i], bgr[i], mats[i], t_rect.size(), cv::INTER_LINEAR);
|
||||||
|
}
|
||||||
|
cv::merge(bgr, 3, dst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
cv::Scalar autoBGColor;
|
cv::Scalar autoBGColor;
|
||||||
|
@ -118,21 +235,31 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
|
|
||||||
if (m_indent > 0)
|
if (m_indent > 0)
|
||||||
{
|
{
|
||||||
std::vector<cv::Point> rectEdge{ cv::Point(0, 0) ,cv::Point(thre_dst.cols - 1, 0),
|
for (size_t i = 0, length = m_maxContour.size() - 1; i < length; i++)
|
||||||
cv::Point(thre_dst.cols - 1, thre_dst.rows - 1), cv::Point(0, thre_dst.rows - 1) };
|
cv::line(thre_dst, m_maxContour[i], m_maxContour[i + 1], cv::Scalar::all(0), m_indent * 2);
|
||||||
std::vector<std::vector<cv::Point>> rectEdges{ rectEdge };
|
cv::line(thre_dst, *m_maxContour.begin(), *m_maxContour.rbegin(), cv::Scalar::all(0), m_indent * 2);
|
||||||
cv::drawContours(thre_dst, rectEdges, 0, cv::Scalar::all(0));
|
|
||||||
cv::Mat element = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(m_indent, m_indent));
|
|
||||||
cv::erode(thre_dst, thre_dst, element, cv::Point(-1, -1), 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//cv::imwrite("abc.jpg", thre_dst);
|
||||||
hierarchy.clear();
|
hierarchy.clear();
|
||||||
contours.clear();
|
contours.clear();
|
||||||
m_maxContour.clear();
|
m_maxContour.clear();
|
||||||
|
|
||||||
hg::findContours(thre_dst, contours, hierarchy, cv::RETR_EXTERNAL);
|
hg::findContours(thre_dst, contours, hierarchy, cv::RETR_EXTERNAL);
|
||||||
if (m_isConvexHull)
|
if (m_isConvexHull)
|
||||||
{
|
{
|
||||||
m_maxContour = hg::getMaxContour(contours, hierarchy);
|
m_maxContour = hg::getMaxContour(contours, hierarchy);
|
||||||
|
|
||||||
|
if (m_maxContour.size() == 0)
|
||||||
|
{
|
||||||
|
thre.release();
|
||||||
|
//<2F><><EFBFBD><EFBFBD>ǹ̶<C7B9><CCB6><EFBFBD><EFBFBD>棬<EFBFBD>뷵<EFBFBD>ز<EFBFBD><D8B2>к<EFBFBD>ijߴ<C4B3>
|
||||||
|
if (!m_isCrop)
|
||||||
|
pDib = pDib(cv::Rect((pDib.cols - m_fixedSize.width) / 2, (pDib.rows - m_fixedSize.height) / 2, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows)).clone();
|
||||||
|
#ifdef LOG
|
||||||
|
FileTools::write_log("imgprc.txt", "exit CImageApplyAutoCrop apply");
|
||||||
|
#endif // LOG
|
||||||
|
return;
|
||||||
|
}
|
||||||
hg::convexHull(m_maxContour, m_maxContour);
|
hg::convexHull(m_maxContour, m_maxContour);
|
||||||
contours.clear();
|
contours.clear();
|
||||||
contours.push_back(m_maxContour);
|
contours.push_back(m_maxContour);
|
||||||
|
@ -147,6 +274,14 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
autoBGColor = m_isFillColor ? getBackGroudColor(pDib, rect.size.area()) : cv::Scalar(255, 255, 255);
|
autoBGColor = m_isFillColor ? getBackGroudColor(pDib, rect.size.area()) : cv::Scalar(255, 255, 255);
|
||||||
hg::fillPolys(dst, contours, autoBGColor);
|
hg::fillPolys(dst, contours, autoBGColor);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_maxContour.clear();
|
||||||
|
m_maxContour.push_back(cv::Point(-1, dst.rows));
|
||||||
|
m_maxContour.push_back(cv::Point(-1, -1));
|
||||||
|
m_maxContour.push_back(cv::Point(dst.cols, -1));
|
||||||
|
m_maxContour.push_back(cv::Point(dst.cols, dst.rows));
|
||||||
|
}
|
||||||
|
|
||||||
pDib.release();
|
pDib.release();
|
||||||
if (/*(m_isCrop && side == 0) || (side == 1 && m_fixedSize.width * m_fixedSize.height == 0)*/ m_isCrop)
|
if (/*(m_isCrop && side == 0) || (side == 1 && m_fixedSize.width * m_fixedSize.height == 0)*/ m_isCrop)
|
||||||
|
@ -166,16 +301,20 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
|
||||||
p += roi.tl();
|
p += roi.tl();
|
||||||
dst(roi).copyTo(pDib(rect));
|
dst(roi).copyTo(pDib(rect));
|
||||||
}
|
}
|
||||||
|
#ifdef LOG
|
||||||
|
FileTools::write_log("imgprc.txt", "exit CImageApplyAutoCrop apply8");
|
||||||
|
#endif // LOG
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
{
|
{
|
||||||
m_rects.clear();
|
|
||||||
if (mats.empty()) return;
|
if (mats.empty()) return;
|
||||||
if (!mats[0].empty()) {
|
if (!mats[0].empty()) {
|
||||||
apply(mats[0], 0);
|
apply(mats[0], 0);
|
||||||
m_rects.push_back(m_rect);
|
m_rects.push_back(m_rect);
|
||||||
//cv::imwrite("1.bmp", mats[0]);
|
brightSharp(mats[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isTwoSide && mats.size() > 1)
|
if (isTwoSide && mats.size() > 1)
|
||||||
|
@ -186,6 +325,7 @@ void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
if (!mats[1].empty()) {
|
if (!mats[1].empty()) {
|
||||||
apply(mats[1], 1);
|
apply(mats[1], 1);
|
||||||
m_rects.push_back(m_rect);
|
m_rects.push_back(m_rect);
|
||||||
|
brightSharp(mats[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mats[0].empty())
|
if (!mats[0].empty())
|
||||||
|
|
|
@ -55,7 +55,8 @@ void ImageApplyUV::Apply(cv::Mat& image, const cv::Mat& uv, int dpi, int thresh)
|
||||||
cv::Mat ImageApplyUV::Apply(const cv::Mat& image, const cv::Mat& uv, const cv::RotatedRect& uvRoi, bool isDesaskew, int angle, int pixtype)
|
cv::Mat ImageApplyUV::Apply(const cv::Mat& image, const cv::Mat& uv, const cv::RotatedRect& uvRoi, bool isDesaskew, int angle, int pixtype)
|
||||||
{
|
{
|
||||||
static int svindex = 0;
|
static int svindex = 0;
|
||||||
if (uvRoi.size.width == 0) return cv::Mat();
|
if (uvRoi.size.width == 0)
|
||||||
|
return cv::Mat();
|
||||||
cv::RotatedRect uvRoi_clone = uvRoi;
|
cv::RotatedRect uvRoi_clone = uvRoi;
|
||||||
cv::Mat dst = cv::Mat::zeros(image.rows > image.cols ? image.rows : (image.rows * 2), image.cols > image.rows ? image.cols : (image.cols * 2), image.type());
|
cv::Mat dst = cv::Mat::zeros(image.rows > image.cols ? image.rows : (image.rows * 2), image.cols > image.rows ? image.cols : (image.cols * 2), image.type());
|
||||||
image.copyTo(dst(cv::Rect(0, 0, image.cols, image.rows)));
|
image.copyTo(dst(cv::Rect(0, 0, image.cols, image.rows)));
|
||||||
|
@ -70,54 +71,76 @@ cv::Mat ImageApplyUV::Apply(const cv::Mat& image, const cv::Mat& uv, const cv::R
|
||||||
if (angle == 90)
|
if (angle == 90)
|
||||||
{
|
{
|
||||||
dstTri[0] = cv::Point2f(0, 0);
|
dstTri[0] = cv::Point2f(0, 0);
|
||||||
dstTri[1] = cv::Point2f(dst_uv.cols - 1, 0);
|
dstTri[1] = cv::Point2f(uvRoi_clone.size.width - 1, 0);
|
||||||
dstTri[2] = cv::Point2f(dst_uv.cols - 1, dst_uv.rows - 1);
|
dstTri[2] = cv::Point2f(uvRoi_clone.size.width - 1, uvRoi_clone.size.height - 1);
|
||||||
}
|
}
|
||||||
else if (angle == 180)
|
else if (angle == 180)
|
||||||
{
|
{
|
||||||
dstTri[0] = cv::Point2f(dst_uv.cols - 1, 0);
|
dstTri[0] = cv::Point2f(uvRoi_clone.size.width - 1, 0);
|
||||||
dstTri[1] = cv::Point2f(dst_uv.cols - 1, dst_uv.rows - 1);
|
dstTri[1] = cv::Point2f(uvRoi_clone.size.width - 1, uvRoi_clone.size.height - 1);
|
||||||
dstTri[2] = cv::Point2f(0, dst_uv.rows - 1);
|
dstTri[2] = cv::Point2f(0, uvRoi_clone.size.height - 1);
|
||||||
}
|
}
|
||||||
else if (angle == 270)
|
else if (angle == 270)
|
||||||
{
|
{
|
||||||
dstTri[0] = cv::Point2f(dst_uv.cols - 1, dst_uv.rows - 1);
|
dstTri[0] = cv::Point2f(uvRoi_clone.size.width - 1, uvRoi_clone.size.height - 1);
|
||||||
dstTri[1] = cv::Point2f(0, dst_uv.rows - 1);
|
dstTri[1] = cv::Point2f(0, uvRoi_clone.size.height - 1);
|
||||||
dstTri[2] = cv::Point2f(0, 0);
|
dstTri[2] = cv::Point2f(0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dstTri[0] = cv::Point2f(0, dst_uv.rows - 1);
|
dstTri[0] = cv::Point2f(0, uvRoi_clone.size.height - 1);
|
||||||
dstTri[1] = cv::Point2f(0, 0);
|
dstTri[1] = cv::Point2f(0, 0);
|
||||||
dstTri[2] = cv::Point2f(dst_uv.cols - 1, 0);
|
dstTri[2] = cv::Point2f(uvRoi_clone.size.width - 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::Mat warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
cv::Mat warp_mat = cv::getAffineTransform(srcTri, dstTri);
|
||||||
if (uv.channels() == 1 && dst_uv.channels() == 3)
|
|
||||||
{
|
|
||||||
cv::Mat uv_temp;
|
cv::Mat uv_temp;
|
||||||
cv::warpAffine(uv, uv_temp, warp_mat, dst_uv.size());
|
cv::warpAffine(uv, uv_temp, warp_mat, cv::Size(uvRoi_clone.size.width, uvRoi_clone.size.height));
|
||||||
cv::cvtColor(uv_temp, dst_uv, cv::COLOR_GRAY2BGR);
|
|
||||||
}
|
//cv::imwrite("uv_temp.jpg", uv_temp);
|
||||||
else
|
|
||||||
{
|
|
||||||
//imwrite("D:\\bfuv" + std::to_string(++svindex) + ".jpg", uv);
|
|
||||||
cv::Mat matuv;
|
|
||||||
if (image.channels() == 1 && uv.channels() == 3)
|
|
||||||
{
|
|
||||||
cvtColor(uv, matuv, COLOR_BGR2GRAY);
|
|
||||||
if (pixtype == 0)//śţ־͟
|
if (pixtype == 0)//śţ־͟
|
||||||
cv::threshold(matuv, matuv, 150, 255, THRESH_OTSU);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
matuv = uv;
|
cvtColor(uv_temp, uv_temp, cv::COLOR_BGR2GRAY);
|
||||||
|
cv::threshold(uv_temp, uv_temp, 150, 255, THRESH_OTSU);
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::warpAffine(matuv, dst_uv, warp_mat, dst_uv.size());
|
if (uv_temp.channels() == 1 && dst_uv.channels() == 3)
|
||||||
//dst_uv.copyTo(dst(cv::Rect(image.rows > image.cols ? image.cols : 0, image.rows > image.cols ? 0 : image.rows, dst_uv.cols, dst_uv.rows)));
|
{
|
||||||
//dst_uv.copyTo(dst(cv::Rect(image.rows > image.cols ? image.cols : 0, image.rows > image.cols ? 0 : image.rows, image.cols, image.rows)));
|
cv::cvtColor(uv_temp(cv::Rect(
|
||||||
//imwrite("D:\\aftuv" + std::to_string(svindex) + ".jpg", dst_uv);
|
uv_temp.cols > dst_uv.cols ? (uv_temp.cols - dst_uv.cols) / 2 : 0,
|
||||||
|
uv_temp.rows > dst_uv.rows ? (uv_temp.rows - dst_uv.rows) / 2 : 0,
|
||||||
|
uv_temp.cols > dst_uv.cols ? dst_uv.cols : uv_temp.cols,
|
||||||
|
uv_temp.rows > dst_uv.rows ? dst_uv.rows : uv_temp.rows)),
|
||||||
|
dst_uv(cv::Rect(
|
||||||
|
dst_uv.cols > uv_temp.cols ? (dst_uv.cols - uv_temp.cols) / 2 : 0,
|
||||||
|
dst_uv.rows > uv_temp.rows ? (dst_uv.rows - uv_temp.rows) / 2 : 0,
|
||||||
|
dst_uv.cols > uv_temp.cols ? uv_temp.cols : dst_uv.cols,
|
||||||
|
dst_uv.rows > uv_temp.rows ? uv_temp.rows : dst_uv.rows)), cv::COLOR_GRAY2BGR);
|
||||||
|
}
|
||||||
|
else if (uv_temp.channels() == 3 && dst_uv.channels() == 1)
|
||||||
|
{
|
||||||
|
cv::cvtColor(uv_temp(cv::Rect(
|
||||||
|
uv_temp.cols > dst_uv.cols ? (uv_temp.cols - dst_uv.cols) / 2 : 0,
|
||||||
|
uv_temp.rows > dst_uv.rows ? (uv_temp.rows - dst_uv.rows) / 2 : 0,
|
||||||
|
uv_temp.cols > dst_uv.cols ? dst_uv.cols : uv_temp.cols,
|
||||||
|
uv_temp.rows > dst_uv.rows ? dst_uv.rows : uv_temp.rows)),
|
||||||
|
dst_uv(cv::Rect(
|
||||||
|
dst_uv.cols > uv_temp.cols ? (dst_uv.cols - uv_temp.cols) / 2 : 0,
|
||||||
|
dst_uv.rows > uv_temp.rows ? (dst_uv.rows - uv_temp.rows) / 2 : 0,
|
||||||
|
dst_uv.cols > uv_temp.cols ? uv_temp.cols : dst_uv.cols,
|
||||||
|
dst_uv.rows > uv_temp.rows ? uv_temp.rows : dst_uv.rows)), cv::COLOR_BGR2GRAY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uv_temp(cv::Rect(
|
||||||
|
uv_temp.cols > dst_uv.cols ? (uv_temp.cols - dst_uv.cols) / 2 : 0,
|
||||||
|
uv_temp.rows > dst_uv.rows ? (uv_temp.rows - dst_uv.rows) / 2 : 0,
|
||||||
|
uv_temp.cols > dst_uv.cols ? dst_uv.cols : uv_temp.cols,
|
||||||
|
uv_temp.rows > dst_uv.rows ? dst_uv.rows : uv_temp.rows)).copyTo(dst_uv(cv::Rect(
|
||||||
|
dst_uv.cols > uv_temp.cols ? (dst_uv.cols - uv_temp.cols) / 2 : 0,
|
||||||
|
dst_uv.rows > uv_temp.rows ? (dst_uv.rows - uv_temp.rows) / 2 : 0,
|
||||||
|
dst_uv.cols > uv_temp.cols ? uv_temp.cols : dst_uv.cols,
|
||||||
|
dst_uv.rows > uv_temp.rows ? uv_temp.rows : dst_uv.rows)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,6 +204,14 @@ namespace hg
|
||||||
rect.size.height = temp;
|
rect.size.height = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rect.angle > 45)
|
||||||
|
{
|
||||||
|
rect.angle -= 90;
|
||||||
|
float temp = rect.size.width;
|
||||||
|
rect.size.width = rect.size.height;
|
||||||
|
rect.size.height = temp;
|
||||||
|
}
|
||||||
|
|
||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ using namespace std::placeholders;
|
||||||
TWPP_ENTRY_MFC(HuagaoDs)
|
TWPP_ENTRY_MFC(HuagaoDs)
|
||||||
|
|
||||||
static constexpr const Identity srcIdent(
|
static constexpr const Identity srcIdent(
|
||||||
Version(3, 3, Language::English, Country::China, "v3.3.5.1"),
|
Version(3, 3, Language::English, Country::China, "v3.3.5.4"),
|
||||||
DataGroup::Image,
|
DataGroup::Image,
|
||||||
#ifdef MAKEHUAGAO
|
#ifdef MAKEHUAGAO
|
||||||
"HUAGO",
|
"HUAGO",
|
||||||
|
|
Binary file not shown.
BIN
huagao/stdafx.h
BIN
huagao/stdafx.h
Binary file not shown.
Loading…
Reference in New Issue