diff --git a/hgdriver/hgdev/common_setting.h b/hgdriver/hgdev/common_setting.h index 2994073..b204e1c 100644 --- a/hgdriver/hgdev/common_setting.h +++ b/hgdriver/hgdev/common_setting.h @@ -701,6 +701,17 @@ namespace setting_hardware //硬件协议定义 -OVER namespace setting3288dsp { + struct HG_JpegCompressInfo + { + unsigned int data_type; + unsigned int first_frame; + unsigned int last_frame; + unsigned int index_frame; + unsigned int DataLength; + unsigned int width; + unsigned int height; + unsigned char* pJpegData; + }; //100-200 dsp 300-400 3288设备状态 typedef enum tagUsbSupported { diff --git a/hgdriver/hgdev/hg_scanner_300.cpp b/hgdriver/hgdev/hg_scanner_300.cpp index bca8388..fa4daf2 100644 --- a/hgdriver/hgdev/hg_scanner_300.cpp +++ b/hgdriver/hgdev/hg_scanner_300.cpp @@ -77,7 +77,12 @@ namespace settingsdsp_300 return code; } } -hg_scanner_300::hg_scanner_300(const char* dev_name,int pid, usb_io* io) : hg_scanner(G100Serial, dev_name, io,pid),papersize(pid), is_devs_sleep_(false) +hg_scanner_300::hg_scanner_300(const char* dev_name,int pid, usb_io* io) : + hg_scanner(G100Serial, dev_name, io,pid) + ,papersize(pid) + ,is_devs_sleep_(false) + ,pdata(NULL) + ,index_ (0) { dsp_config.value = 0; dsp_config.params_3288.enableLed = 1; //默认值 @@ -533,6 +538,94 @@ int hg_scanner_300::get_img_data(std::shared_ptr &imagedata) return status_ = ret; } +int hg_scanner_300::get_img_data_7010(std::shared_ptr& imagedata) +{ + int total = imagedata->size(), + ret = SCANNER_ERR_OK, + index = 0, + block = total; + + USBCB usb{ setting3288dsp::GET_IMAGE, 0, total }; + { + std::lock_guard lock(io_lock_); + ret = writeusb(usb); + + + setting3288dsp::HG_JpegCompressInfo info; + + int len = sizeof(int) * 7; + ret = io_->read_bulk(&info, &len); + + std::vector jpgdata; + + jpgdata.resize(info.DataLength); + ret = io_->read_bulk(&jpgdata[0], (int*)&info.DataLength); + + int width = info.width; + int hegiht = info.height; + int frame_total = info.index_frame; + if (info.first_frame) + { + pdata = (char*)malloc(width * hegiht * frame_total); + index_ = 0; + } + + cv::ImreadModes rmc = cv::IMREAD_GRAYSCALE; + + cv::Mat mat(cv::imdecode(jpgdata, rmc)); + //cv::imwrite("C://Users//modehua//Desktop//image//opencv"+to_string(cnt)+".jpg", mat); + //cnt++; + if (!pdata) + { + return SCANNER_ERR_INSUFFICIENT_MEMORY; + } + memcpy(pdata + index_, (void*)mat.data, mat.total() * mat.elemSize()); + index_ += mat.total() * mat.elemSize(); + + if (info.last_frame) + { + cv::Mat mat = cv::Mat(hegiht * frame_total, width, CV_8UC1, pdata, cv::Mat::AUTO_STEP); + //cv::imwrite("C://Users//modehua//Desktop//image//2_opencv.jpg", mat); + if (mat.empty()) + { + return SCANNER_ERR_INSUFFICIENT_MEMORY; + } + + int width = mat.cols; + int height = mat.rows; + cv::Mat m_dst = mat; + if (image_prc_param_.bits.color_mode == 2) + { + width = mat.cols / 3; + height = mat.rows; + m_dst = cv::Mat(height, width, CV_8UC3); + std::vector m_items; + + for (size_t i = 0; i < 3; i++) + { + cv::Mat t_item(mat(cv::Rect(width * i, 0, width, height))); + m_items.push_back(t_item); + } + cv::merge(m_items, m_dst); + } + + cv::imwrite("C://Users//modehua//Desktop//image//1_opencv.jpg", m_dst); + std::shared_ptr image_data_(aquire_memory(width * hegiht * frame_total)); + + unsigned int size = width * hegiht * frame_total;// bmpdata.size(); + void* l = image_data_->data(0, &size); + memcpy(l, m_dst.data, width * hegiht * frame_total); + + //ret = save_usb_data(image_data_); + index_ = 0; + if (pdata) + { + free(pdata); + } + } + return SCANNER_ERR_OK; + } +} int hg_scanner_300::writedown_device_configuration(bool type,setting_hardware::HGSCANCONF_3288 *d) { if (!type) diff --git a/hgdriver/hgdev/hg_scanner_300.h b/hgdriver/hgdev/hg_scanner_300.h index 446b071..f1b0f4f 100644 --- a/hgdriver/hgdev/hg_scanner_300.h +++ b/hgdriver/hgdev/hg_scanner_300.h @@ -60,6 +60,7 @@ private: int pop_image(void); int get_scanner_status(USBCB &usb); int get_img_data(std::shared_ptr &imagedata); + int get_img_data_7010(std::shared_ptr& imagedata); int writedown_device_configuration(bool type =false,setting_hardware::HGSCANCONF_3288 *d = NULL); void writedown_image_configuration(void); void printf_devconfig(setting_hardware::HGSCANCONF_3288 *d = NULL); @@ -68,6 +69,8 @@ private: setting_hardware::HGSCANCONF_3288 dsp_config; Device::PaperSize papersize; bool is_devs_sleep_; + int index_; + char* pdata; public: //////////////固定的硬件信息设置或获取////////////// virtual std::string get_firmware_version(void)override; diff --git a/hgdriver/hgdev/image_process.cpp b/hgdriver/hgdev/image_process.cpp index 3b63b5d..5796541 100644 --- a/hgdriver/hgdev/image_process.cpp +++ b/hgdriver/hgdev/image_process.cpp @@ -487,7 +487,11 @@ namespace hg_imgproc { rmc = cv::IMREAD_COLOR; } - cv::Mat mat(cv::imdecode(*buf, rmc)); + cv::Mat mat; + if (true) + mat(cv::imdecode(*buf, rmc)); + else + mat = cv::Mat(512 * 5, 15552 / 3, CV_8UC1, buf->data(), cv::Mat::AUTO_STEP).clone(); //cv::imwrite("C:\\Users\\modehua\\Desktop\\image\\imdecode.jpg",mat); if (mat.empty())