This commit is contained in:
13038267101 2023-10-21 09:03:47 +08:00
commit c770715397
10 changed files with 79 additions and 49 deletions

View File

@ -6,6 +6,8 @@
#include "Device/filetools.h" #include "Device/filetools.h"
#endif // LOG #endif // LOG
//#define DRAW_PIC
CImageApplyOutHole::CImageApplyOutHole(void) CImageApplyOutHole::CImageApplyOutHole(void)
: CImageApply() : CImageApply()
, m_borderSize(20) , m_borderSize(20)
@ -76,14 +78,20 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Mat front_thre, back_thre; cv::Mat front_thre, back_thre;
hg::threshold_Mat(front, front_thre, m_threshold); hg::threshold_Mat(front, front_thre, m_threshold);
hg::threshold_Mat(back, back_thre, m_threshold); hg::threshold_Mat(back, back_thre, m_threshold);
//cv::imwrite("front_thre.jpg", front_thre);
//cv::imwrite("back_thre.jpg", back_thre); #ifdef DRAW_PIC
cv::imwrite("front_thre.jpg", front_thre);
cv::imwrite("back_thre.jpg", back_thre);
#endif
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5 * resize_scale, 1)); cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5 * resize_scale, 1));
cv::morphologyEx(front_thre, front_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0)); cv::morphologyEx(front_thre, front_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0));
cv::morphologyEx(back_thre, back_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0)); cv::morphologyEx(back_thre, back_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0));
//cv::imwrite("front_thre2.jpg", front_thre);
//cv::imwrite("back_thre2.jpg", back_thre); #ifdef DRAW_PIC
cv::imwrite("front_thre2.jpg", front_thre);
cv::imwrite("back_thre2.jpg", back_thre);
#endif
//反面二值化图像水平翻转 //反面二值化图像水平翻转
cv::flip(back_thre, back_thre, 1); //1:Horizontal cv::flip(back_thre, back_thre, 1); //1:Horizontal
@ -94,22 +102,22 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
hg::findContours(front_thre.clone(), contours_front, b1_front, cv::RETR_CCOMP); hg::findContours(front_thre.clone(), contours_front, b1_front, cv::RETR_CCOMP);
hg::findContours(back_thre.clone(), contours_back, b1_back, cv::RETR_CCOMP); hg::findContours(back_thre.clone(), contours_back, b1_back, cv::RETR_CCOMP);
//提取正反面图像最大轮廓 ////提取正反面图像最大轮廓
for (size_t i = 0; i < contours_front.size(); i++) //for (size_t i = 0; i < contours_front.size(); i++)
if (contours_front[i].size() < MIN_CONTOUR_SIZE) // if (contours_front[i].size() < MIN_CONTOUR_SIZE)
{ // {
contours_front.erase(contours_front.begin() + i); // contours_front.erase(contours_front.begin() + i);
b1_front.erase(b1_front.begin() + i); // b1_front.erase(b1_front.begin() + i);
i--; // i--;
} // }
for (size_t i = 0; i < contours_back.size(); i++) //for (size_t i = 0; i < contours_back.size(); i++)
if (contours_back[i].size() < MIN_CONTOUR_SIZE) // if (contours_back[i].size() < MIN_CONTOUR_SIZE)
{ // {
contours_back.erase(contours_back.begin() + i); // contours_back.erase(contours_back.begin() + i);
b1_back.erase(b1_back.begin() + i); // b1_back.erase(b1_back.begin() + i);
i--; // i--;
} // }
std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front); std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front);
std::vector<cv::Point> maxContour_back = hg::getMaxContour(contours_back, b1_back); std::vector<cv::Point> maxContour_back = hg::getMaxContour(contours_back, b1_back);
@ -132,26 +140,41 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Mat roiMat_front(front_thre, roi_front); //在正面二值图像中截取重叠部分 cv::Mat roiMat_front(front_thre, roi_front); //在正面二值图像中截取重叠部分
cv::Mat roiMat_back(back_thre, roi_back); //在反面二值图像中截取重叠部分 cv::Mat roiMat_back(back_thre, roi_back); //在反面二值图像中截取重叠部分
//cv::imwrite("roiMat_front.jpg", roiMat_front);
//cv::imwrite("roiMat_back.jpg", roiMat_back); #ifdef DRAW_PIC
cv::imwrite("roiMat_front.jpg", roiMat_front);
cv::imwrite("roiMat_back.jpg", roiMat_back);
#endif
//正反面二值图像做或运算真正镂空区域保留0其他地方填充为255 //正反面二值图像做或运算真正镂空区域保留0其他地方填充为255
cv::Mat mask; cv::Mat mask;
cv::bitwise_or(roiMat_front, roiMat_back, mask); //或运算,正反面二值图像重叠 cv::bitwise_or(roiMat_front, roiMat_back, mask); //或运算,正反面二值图像重叠
//cv::imwrite("mask1.jpg", mask);
#ifdef DRAW_PIC
cv::imwrite("mask1.jpg", mask);
#endif
//二值图像重叠图像颜色取反,膨胀,提取轮廓 //二值图像重叠图像颜色取反,膨胀,提取轮廓
cv::bitwise_not(mask, mask); cv::bitwise_not(mask, mask);
//cv::imwrite("mask2.jpg", mask); //反色
#ifdef DRAW_PIC
cv::imwrite("mask2.jpg", mask); //反色
#endif
//为了避免孔洞彻底贯穿纸边,人为绘制纸张轮廓,确保所有孔洞为封闭图形,不会与背景粘连 //为了避免孔洞彻底贯穿纸边,人为绘制纸张轮廓,确保所有孔洞为封闭图形,不会与背景粘连
cv::polylines(mask, hg::getVertices(mask_rotatedRect), true, cv::Scalar(0), LINE_WIDTH * resize_scale); //绘制纸张矩形边缘 cv::polylines(mask, hg::getVertices(mask_rotatedRect), true, cv::Scalar(0), LINE_WIDTH * resize_scale); //绘制纸张矩形边缘
//cv::imwrite("mask3.jpg", mask);
#ifdef DRAW_PIC
cv::imwrite("mask3.jpg", mask);
#endif
//膨胀算法,增大孔洞连通区域面积 //膨胀算法,增大孔洞连通区域面积
element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(DILATE_SIZE * resize_scale, DILATE_SIZE * resize_scale)); element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(DILATE_SIZE * resize_scale, DILATE_SIZE * resize_scale));
cv::dilate(mask, mask, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar(255)); cv::dilate(mask, mask, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar(255));
//cv::imwrite("mask4.jpg", mask);
#ifdef DRAW_PIC
cv::imwrite("mask4.jpg", mask);
#endif
//提取重叠图像轮廓 //提取重叠图像轮廓
std::vector<std::vector<cv::Point>> contours_mask; std::vector<std::vector<cv::Point>> contours_mask;

View File

@ -25,7 +25,8 @@
* 2022/09/16 v1.9 * 2022/09/16 v1.9
* 2022/09/16 v1.9.1 * 2022/09/16 v1.9.1
* 2022/11/17 v1.9.2 BUG * 2022/11/17 v1.9.2 BUG
* v1.9.2 * 2023/05/16 v1.9.3 BUG
* v1.9.3
* ==================================================== * ====================================================
*/ */

View File

@ -161,7 +161,7 @@ hg_scanner::hg_scanner(ScannerSerial serial, const char* dev_name, usb_io* io, i
, is_auto_paper_scan_exit_time(60), is_read_int(true), is_auto_feedmode_(false) , is_auto_paper_scan_exit_time(60), is_read_int(true), is_auto_feedmode_(false)
, firmware_sup_wait_paper_(false),firmware_sup_pick_strength_(false),firmware_sup_log_export_(false),firmware_sup_color_corr_(false),firmware_sup_wake_device_(false) , firmware_sup_wait_paper_(false),firmware_sup_pick_strength_(false),firmware_sup_log_export_(false),firmware_sup_color_corr_(false),firmware_sup_wake_device_(false)
, firmware_sup_double_img(false),firmware_sup_devs_lock_(false),firmware_sup_dpi_300(false),firmware_sup_dpi_600(false),firmware_sup_auto_speed_(false),firmware_sup_morr_(false) , firmware_sup_double_img(false),firmware_sup_devs_lock_(false),firmware_sup_dpi_300(false),firmware_sup_dpi_600(false),firmware_sup_auto_speed_(false),firmware_sup_morr_(false)
, firmware_sup_color_fill_(false),firmware_sup_history_cnt(false), have_max_size(false), is_discardblank(false) , firmware_sup_color_fill_(false),firmware_sup_history_cnt(false), have_max_size(false), is_discardblank(false),firmware_sup_device_7010(false)
, auto_scan_restore_(false), auto_scan_prev_(is_auto_paper_scan) , auto_scan_restore_(false), auto_scan_prev_(is_auto_paper_scan)
{ {
#if !defined(_WIN32) && !defined(_WIN64) &&defined(x86_64) #if !defined(_WIN32) && !defined(_WIN64) &&defined(x86_64)
@ -456,12 +456,12 @@ int hg_scanner::hg_version_init_handle()
{ {
int ret = SCANNER_ERR_OK; int ret = SCANNER_ERR_OK;
#ifndef WIN32 #ifndef WIN32
string scanner_path = hg_log::get_module_full_path(LIBNAME); string scanner_path = hg_log::get_module_full_path(MODULE_NAME_SCANNER);
if (scanner_path.empty()) if (scanner_path.empty())
{ {
return SCANNER_ERR_OUT_OF_RANGE; return SCANNER_ERR_OUT_OF_RANGE;
} }
scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(LIBNAME)); scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(MODULE_NAME_SCANNER));
string HGVersionlib_path = scanner_path + HGVERSION_LIBNANE; string HGVersionlib_path = scanner_path + HGVERSION_LIBNANE;
if (access(HGVersionlib_path.c_str(), F_OK) != 0) if (access(HGVersionlib_path.c_str(), F_OK) != 0)
@ -482,8 +482,8 @@ int hg_scanner::hg_version_init_handle()
HGVersion_Free_ = (SDKHGVersion_Free_)dlsym(Dynamicopen_HGVersion_pHandle_, "HGVersion_DestroyMgr"); HGVersion_Free_ = (SDKHGVersion_Free_)dlsym(Dynamicopen_HGVersion_pHandle_, "HGVersion_DestroyMgr");
#else #else
string scanner_path = hg_log::get_module_full_path(LIBNAME); string scanner_path = hg_log::get_module_full_path(MODULE_NAME_SCANNER);
scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(LIBNAME)); scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(MODULE_NAME_SCANNER));
string HGVersionlib_path = scanner_path + HGVERSION_LIBNANE; string HGVersionlib_path = scanner_path + HGVERSION_LIBNANE;
wchar_t* Prclibbuffer = new wchar_t[HGVersionlib_path.length() + 1]; wchar_t* Prclibbuffer = new wchar_t[HGVersionlib_path.length() + 1];

View File

@ -430,14 +430,6 @@ protected:
void adjust_filling_hole(LPSCANCONF conf); void adjust_filling_hole(LPSCANCONF conf);
enum thread_running
{
THREAD_RUNNING_IDLE = 0,
THREAD_RUNNING_USB = 1 << 0,
THREAD_RUNNING_IMAGE = 1 << 1,
};
int is_running(void); // return thread_running
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// 新增自定义伽玛曲线及扫描区域属性 - 2022-05-05 // 新增自定义伽玛曲线及扫描区域属性 - 2022-05-05
bool custom_gamma_; // 为true时应用custom_gamma_val_阵列调整图像色彩为false时保持原来的处理方式 bool custom_gamma_; // 为true时应用custom_gamma_val_阵列调整图像色彩为false时保持原来的处理方式
@ -476,6 +468,14 @@ public:
bool is_online(void); bool is_online(void);
void on_language_changed(void); void on_language_changed(void);
enum thread_running
{
THREAD_RUNNING_IDLE = 0,
THREAD_RUNNING_USB = 1 << 0,
THREAD_RUNNING_IMAGE = 1 << 1,
};
int is_running(void); // return thread_running
public: public:
virtual int start(void); virtual int start(void);
virtual int get_image_info(SANE_Parameters* ii, int len); virtual int get_image_info(SANE_Parameters* ii, int len);

View File

@ -866,8 +866,8 @@ int hg_scanner_300::initdevice()
{ {
if (fw.substr(4, 6) == "230303") if (fw.substr(4, 6) == "230303")
{ {
string scanner_path = hg_log::get_module_full_path(LIBNAME); string scanner_path = hg_log::get_module_full_path(MODULE_NAME_SCANNER);
scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(LIBNAME)); scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(MODULE_NAME_SCANNER));
scanner_path += "update.zip"; scanner_path += "update.zip";
set_firmware_upgrade(scanner_path); set_firmware_upgrade(scanner_path);
return SCANNER_ERR_OK; return SCANNER_ERR_OK;
@ -1558,8 +1558,8 @@ int hg_scanner_300::set_updata0303(void)
{ {
if (fw.substr(4, 6) == "230303") if (fw.substr(4, 6) == "230303")
{ {
string scanner_path = hg_log::get_module_full_path(LIBNAME); string scanner_path = hg_log::get_module_full_path(MODULE_NAME_SCANNER);
scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(LIBNAME)); scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(MODULE_NAME_SCANNER));
scanner_path += "update.zip"; scanner_path += "update.zip";
set_firmware_upgrade(scanner_path); set_firmware_upgrade(scanner_path);
} }

View File

@ -353,8 +353,8 @@ namespace hg_imgproc
HGBase_FreeImg = (SDKHGBase_FreeImage_)dlsym(Dynamicopen_HGBase_pHandle_,"HGBase_DestroyImage"); HGBase_FreeImg = (SDKHGBase_FreeImage_)dlsym(Dynamicopen_HGBase_pHandle_,"HGBase_DestroyImage");
#else #else
string scanner_path = hg_log::get_module_full_path("scanner.dll"); string scanner_path = hg_log::get_module_full_path(MODULE_NAME_SCANNER);
scanner_path = scanner_path.substr(0, scanner_path.size() - strlen("scanner.dll")); scanner_path = scanner_path.substr(0, scanner_path.size() - strlen(MODULE_NAME_SCANNER));
string HGImagePrclib_path = scanner_path + IMGPRC_LIBNANE; string HGImagePrclib_path = scanner_path + IMGPRC_LIBNANE;
string HGBaselib_path = scanner_path + HGBASE_LIBNAME; string HGBaselib_path = scanner_path + HGBASE_LIBNAME;

View File

@ -1067,7 +1067,13 @@ scanner_err hg_scanner_mgr::hg_scanner_start(scanner_handle h, void* async_event
} }
scanner_err hg_scanner_mgr::hg_scanner_stop(scanner_handle h) scanner_err hg_scanner_mgr::hg_scanner_stop(scanner_handle h)
{ {
return (scanner_err)SCAN_PTR(h)->stop(); scanner_err err = (scanner_err)SCAN_PTR(h)->stop();
// call from APP, block when all working-threads stopped - added on 2023-10-18 when handled double-feeding in SANE
while (SCAN_PTR(h)->is_running() != hg_scanner::THREAD_RUNNING_IDLE)
std::this_thread::sleep_for(std::chrono::milliseconds(3));
return err;
} }
scanner_err hg_scanner_mgr::hg_scanner_get_img_info(scanner_handle h, SANE_Parameters* bmi, long len) scanner_err hg_scanner_mgr::hg_scanner_get_img_info(scanner_handle h, SANE_Parameters* bmi, long len)
{ {

View File

@ -36,7 +36,7 @@ endif()
target_link_libraries(${PROJECT_NAME} PRIVATE target_link_libraries(${PROJECT_NAME} PRIVATE
${PROJECT_SOURCE_DIR}/../../../build/libgdev.a ${PROJECT_SOURCE_DIR}/../../../build/libgdev.a
${PROJECT_SOURCE_DIR}/../../../build/libgimgproc.a ${PROJECT_SOURCE_DIR}/../../../build/libgimgproc.a
${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/liblang.so ${PROJECT_SOURCE_DIR}/../../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libyuyanbao.so
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgproc.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgproc.a
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgcodecs.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_imgcodecs.a
${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_highgui.a ${PROJECT_SOURCE_DIR}/../3rdparty/opencv/lib/uos/${CMAKE_SYSTEM_PROCESSOR}/libopencv_highgui.a

View File

@ -18,7 +18,7 @@ link_directories(${PROJECT_NAME} PRIVATE
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR} ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}
) )
target_link_libraries(${PROJECT_NAME} PRIVATE hgdriver target_link_libraries(${PROJECT_NAME} PRIVATE hgdriver
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/liblang.so ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libyuyanbao.so
${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libhgdriver.so ${PROJECT_SOURCE_DIR}/../../release/uos/${CMAKE_SYSTEM_PROCESSOR}/libhgdriver.so
) )

View File

@ -31,7 +31,7 @@
#if defined(WIN32) || defined(_WIN64) #if defined(WIN32) || defined(_WIN64)
#include "../../../sdk/include/huagao/brand.h" #include "../../../sdk/include/huagao/brand.h"
#ifndef HGSCANNER_EXPORT #ifndef HGSCANNER_EXPORT
#pragma comment(lib, "scanner.lib") #pragma comment(lib, "scannerqd.lib")
#endif #endif
#define VERSION_MAJOR VERSION_MAIN #define VERSION_MAJOR VERSION_MAIN
#define VERSION_MINOR VERSION_SUB #define VERSION_MINOR VERSION_SUB