新增7010出图流程

This commit is contained in:
13038267101 2023-08-16 08:59:49 +08:00
parent 36a260b756
commit 68343deb5d
4 changed files with 113 additions and 2 deletions

View File

@ -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
{

View File

@ -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<tiny_buffer> &imagedata)
return status_ = ret;
}
int hg_scanner_300::get_img_data_7010(std::shared_ptr<tiny_buffer>& imagedata)
{
int total = imagedata->size(),
ret = SCANNER_ERR_OK,
index = 0,
block = total;
USBCB usb{ setting3288dsp::GET_IMAGE, 0, total };
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usb);
setting3288dsp::HG_JpegCompressInfo info;
int len = sizeof(int) * 7;
ret = io_->read_bulk(&info, &len);
std::vector<unsigned char> 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<cv::Mat> 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<tiny_buffer> 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)

View File

@ -60,6 +60,7 @@ private:
int pop_image(void);
int get_scanner_status(USBCB &usb);
int get_img_data(std::shared_ptr<tiny_buffer> &imagedata);
int get_img_data_7010(std::shared_ptr<tiny_buffer>& 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;

View File

@ -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())