From 47e802669c9f0af319eb38d4ea0b532aaf30cfe7 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Wed, 15 Nov 2023 11:31:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=A4=9A=E6=B5=81=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E7=AE=97=E6=B3=95=E5=B0=81=E8=A3=85=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/hgdev/imgproc-pak/multi_out.cpp | 90 ++++++++++++++++ hgdriver/hgdev/imgproc-pak/multi_out.h | 129 +++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 hgdriver/hgdev/imgproc-pak/multi_out.cpp create mode 100644 hgdriver/hgdev/imgproc-pak/multi_out.h diff --git a/hgdriver/hgdev/imgproc-pak/multi_out.cpp b/hgdriver/hgdev/imgproc-pak/multi_out.cpp new file mode 100644 index 0000000..a518c73 --- /dev/null +++ b/hgdriver/hgdev/imgproc-pak/multi_out.cpp @@ -0,0 +1,90 @@ +#include "multi_out.h" + +#include +#include +#include +#include + + + + +static std::string device_opt_json[] = { + "{\"is-multiout\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"fix-id\":34817,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"multiout-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"fix-id\":34818,\"auth\":0,\"enabled\":false,\"size\":66,\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend\":\"is-multiout==true\"},\"mo-threshold\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u591a\\u6d41\\u9ed1\\u767d\\u9608\\u503c\",\"desc\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u9ed1\\u767d\\u56fe\\u50cf\\u65f6\\u7684\\u4e8c\\u503c\\u5316\\u9608\\u503c\",\"type\":\"int\",\"auth\":0,\"size\":4,\"cur\":40,\"default\":40,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend\":\"is-multiout==true\"},\"mo-bin-type\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u4e8c\\u503c\\u5316\\u65b9\\u6cd5\",\"desc\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u9ed1\\u767d\\u56fe\\u50cf\\u65f6\\u7684\\u4e8c\\u503c\\u5316\\u65b9\\u6cd5\",\"type\":\"string\",\"auth\":0,\"size\":28,\"cur\":\"\\u5355\\u9608\\u503c\",\"default\":\"\\u5355\\u9608\\u503c\",\"range\":[\"\\u5355\\u9608\\u503c\",\"\\u5927\\u6d25\\u9608\\u503c\",\"\\u9ad8\\u65af\\u5c40\\u90e8\\u81ea\\u9002\\u5e94\",\"\\u5747\\u503c\\u5c40\\u90e8\\u81ea\\u9002\\u5e94\",\"\\u9519\\u8bef\\u6269\\u6563\"],\"depend\":\"is-multiout==true\"},\"mo-bin-block-size\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u4e8c\\u503c\\u5316\\u5757\\u5927\\u5c0f\",\"desc\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u9ed1\\u767d\\u56fe\\u50cf\\u65f6\\u7684\\u4e8c\\u503c\\u5316\\u5757\\u5927\\u5c0f\",\"type\":\"int\",\"auth\":0,\"size\":4,\"cur\":51,\"default\":51,\"range\":{\"min\":5,\"max\":200,\"step\":1},\"depend\":\"is-multiout==true\"},\"mo-bin-const\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u4e8c\\u503c\\u5316\\u5e38\\u91cf\",\"desc\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u9ed1\\u767d\\u56fe\\u50cf\\u65f6\\u7684\\u4e8c\\u503c\\u5316\\u5e38\\u91cf\",\"type\":\"int\",\"auth\":0,\"size\":4,\"cur\":41,\"default\":41,\"range\":{\"min\":5,\"max\":200,\"step\":1},\"depend\":\"is-multiout==true\"}}" +}; + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// image_processor +multi_outer::multi_outer() : image_processor("multi_outer") +{ + std::string json(""); + + for (auto& v : device_opt_json) + json += v; + + set_opt_json_text(&json[0]); + enabled_ = false; +} +multi_outer::~multi_outer() +{} + +int multi_outer::type_from_str(const char* type) +{ + static struct + { + std::string str; + int type; + }typemap[] = { + { OPTION_VALUE_DLSCLX_CS_HD_HB, IMageMulti::ALL}, + { OPTION_VALUE_DLSCLX_CS_HD, IMageMulti::COLORGRAY }, + { OPTION_VALUE_DLSCLX_CS_HB, IMageMulti::COLORBW }, + { OPTION_VALUE_DLSCLX_HD_HB, IMageMulti::GRAYBW } + }; + + for (auto& v : typemap) + { + if (v.str == type) + return v.type; + } + + return typemap[0].type; +} + +int multi_outer::set_value(const char* name, void* val) +{ + int ret = SCANNER_ERR_OK; // SCANNER_ERR_DEVICE_NOT_SUPPORT; + + if (strcmp(name, SANE_STD_OPT_NAME_IS_MULTI_OUT) == 0) + enabled_ = *(bool*)val; + else if (strcmp(name, SANE_STD_OPT_NAME_MULTI_OUT_TYPE) == 0) + type_ = multi_outer::type_from_str(to_default_language((char*)val, nullptr)); + else + ret = SCANNER_ERR_DEVICE_NOT_SUPPORT; + + return ret; +} +void multi_outer::enable(const char* name, bool able) +{ + enabled_ = able; +} +int multi_outer::process(std::vector& in, std::vector& out) +{ + int ret = SCANNER_ERR_OK; + + if (!enabled_) + out = in; + else + { + IMageMulti multi(type_, threshold_, threshold_type_, block_size_, constant_); + for (auto& v : in) + { + std::vector o = multi.apply(v.img); + } + } + + return ret; +} + + + + diff --git a/hgdriver/hgdev/imgproc-pak/multi_out.h b/hgdriver/hgdev/imgproc-pak/multi_out.h new file mode 100644 index 0000000..88404a8 --- /dev/null +++ b/hgdriver/hgdev/imgproc-pak/multi_out.h @@ -0,0 +1,129 @@ +#pragma once + +// image processor +// +// created on 2023-11-14 +// +// ver: 1.0 +// +// NOTE: the interface is for all algorithms are in ONE module + +#include +#include + + +class multi_outer : public image_processor +{ + int type_ = IMageMulti::ALL; + int threshold_ = 40; + int threshold_type_ = 0; + int block_size_ = 51; + int constant_ = 41; + +public: + multi_outer(); + + static int type_from_str(const char* type); + +protected: + virtual ~multi_outer(); + +public: + virtual int set_value(const char* name, void* val) override; + virtual void enable(const char* name, bool able) override; + virtual int process(std::vector& in, std::vector& out) override; +}; + +//{ +// "is-multiout": { +// "cat": "base", +// "group": "base", +// "title": "多流输出", +// "desc": "同时输出多种颜色模式的图像", +// "type": "bool", +// "fix-id": 34817, +// "auth": 0, +// "size": 4, +// "cur": false, +// "default": false +// }, +// "multiout-type": { +// "cat": "base", +// "group": "base", +// "title": "多流输出类型", +// "desc": "选择多流输出的类型", +// "type": "string", +// "fix-id": 34818, +// "auth": 0, +// "enabled": false, +// "size": 66, +// "cur": "彩色+灰度+黑白", +// "default": "彩色+灰度+黑白", +// "range": ["彩色+灰度+黑白", "彩色+灰度", "彩色+黑白", "灰度+黑白"], +// "depend": "is-multiout==true" +// }, +// "mo-threshold": { +// "cat": "base", +// "group": "imgp", +// "title": "多流黑白阈值", +// "desc": "多流输出黑白图像时的二值化阈值", +// "type": "int", +// "auth": 0, +// "size": 4, +// "cur": 40, +// "default": 40, +// "range": { +// "min": 1, +// "max": 255, +// "step": 1 +// }, +// "depend": "is-multiout==true" +// }, +// "mo-bin-type": { +// "cat": "base", +// "group": "imgp", +// "title": "二值化方法", +// "desc": "多流输出黑白图像时的二值化方法", +// "type": "string", +// "auth": 0, +// "size": 28, +// "cur": "单阈值", +// "default": "单阈值", +// "range": ["单阈值", "大津阈值", "高斯局部自适应", "均值局部自适应", "错误扩散"], +// "depend": "is-multiout==true" +// }, +// "mo-bin-block-size": { +// "cat": "base", +// "group": "imgp", +// "title": "二值化块大小", +// "desc": "多流输出黑白图像时的二值化块大小", +// "type": "int", +// "auth": 0, +// "size": 4, +// "cur": 51, +// "default": 51, +// "range": { +// "min": 5, +// "max": 200, +// "step": 1 +// }, +// "depend": "is-multiout==true" +// }, +// "mo-bin-const": { +// "cat": "base", +// "group": "imgp", +// "title": "二值化常量", +// "desc": "多流输出黑白图像时的二值化常量", +// "type": "int", +// "auth": 0, +// "size": 4, +// "cur": 41, +// "default": 41, +// "range": { +// "min": 5, +// "max": 200, +// "step": 1 +// }, +// "depend": "is-multiout==true" +// } +//}