From 79b5b1f8a4bcef0a765c28891ce3de38186c6196 Mon Sep 17 00:00:00 2001 From: 13038267101 Date: Fri, 30 Dec 2022 17:54:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=A1=E6=AD=A3=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/ImageProcess/CISTestImageProcess.cpp | 109 +++++++++++++++--- hgdriver/ImageProcess/CISTestImageProcess.h | 10 +- hgdriver/hgdev/hg_scanner_200.cpp | 1 + hgdriver/hgdev/hg_scanner_300.cpp | 7 +- hgdriver/hgdev/hg_scanner_400.cpp | 1 + 5 files changed, 100 insertions(+), 28 deletions(-) diff --git a/hgdriver/ImageProcess/CISTestImageProcess.cpp b/hgdriver/ImageProcess/CISTestImageProcess.cpp index 8a2816b..07ef642 100644 --- a/hgdriver/ImageProcess/CISTestImageProcess.cpp +++ b/hgdriver/ImageProcess/CISTestImageProcess.cpp @@ -2,8 +2,35 @@ int CISTestImageProcess::test(const cv::Mat& image, CISTestResult& result) { - std::vector marks; - findMarks(image, marks); + //std::vector marks; + //int res = findMarks(image, marks); + //return res; + + if (image.channels() != 3) + return -1; + + cv::Mat hsv; + cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV_FULL); + std::vector hsv_channels; + cv::split(hsv, hsv_channels); + + cv::Mat mask_s, range_h, range_temp; + cv::inRange(hsv_channels[1], 100, 255, mask_s); //饱和度在[50, 220]的像素 + + //cv::imwrite("range1.jpg", mask_s); + cv::inRange(hsv_channels[0], 0, 84, range_h); //饱和度在[220, 255]的像素 + cv::inRange(hsv_channels[0], 213, 255, range_temp); //饱和度在[220, 255]的像素 + //cv::imwrite("range3.jpg", range_temp); + range_h &= mask_s; + range_h |= range_temp & mask_s; + findEllipse(range_h, result.scaleXY1); + cv::inRange(hsv_channels[0], 42, 170, range_h); //饱和度在[220, 255]的像素 + range_h &= mask_s; + findEllipse(range_h, result.scaleXY2); + cv::inRange(hsv_channels[0], 128, 213, range_h); //饱和度在[220, 255]的像素 + range_h &= mask_s; + findEllipse(range_h, result.scaleXY3); + return 0; } @@ -69,6 +96,39 @@ void CISTestImageProcess::findContours(const cv::Mat& src, std::vector& src, std::vector& dst, bool clockwise) +{ + CvMemStorage* storage = cvCreateMemStorage(); // + CvSeq* ptseq = cvCreateSeq(CV_SEQ_KIND_GENERIC | CV_32SC2, sizeof(CvContour), sizeof(CvPoint), storage); //ptseqstorage + + //将src的点集填充至ptseq + for (const cv::Point& item : src) + { + CvPoint p; + p.x = item.x; + p.y = item.y; + cvSeqPush(ptseq, &p); + } + + //获取轮廓点 + CvSeq* hull = cvConvexHull2(ptseq, nullptr, clockwise ? CV_CLOCKWISE : CV_COUNTER_CLOCKWISE, 0); + + if (hull == nullptr) + { + //释放storage + cvReleaseMemStorage(&storage); + return; + } + + //填充dst + dst.clear(); + for (int i = 0, hullCount = hull->total; i < hullCount; i++) + dst.push_back(**CV_GET_SEQ_ELEM(CvPoint*, hull, i)); + + //释放storage + cvReleaseMemStorage(&storage); +} + int CISTestImageProcess::findPaperContour(const std::vector>& contours, const std::vector& hierarchy, cv::RotatedRect& paperRect) { std::vector maxContour; @@ -116,27 +176,38 @@ int CISTestImageProcess::classfiyContours(const std::vector& marks) +int CISTestImageProcess::findEllipse(const cv::Mat& image, double& scale_xy, double areaThre) { - int res = 0; - cv::Mat thre; - if (image.channels() != 1) - { - cv::cvtColor(image, thre, cv::COLOR_BGR2GRAY); - cv::threshold(thre, thre, 127, 255, cv::THRESH_BINARY); - } - else - cv::threshold(image, thre, 127, 255, cv::THRESH_BINARY); - + //cv::imwrite("range2.jpg", image); std::vector> contours; std::vector hierarchy; - findContours(thre, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE); - cv::RotatedRect paperRect; - res = findPaperContour(contours, hierarchy, paperRect); + findContours(image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); - if (res != 0) - return res; + std::vector maxContour; + for (std::vector>::iterator iter = contours.begin(); iter != contours.end(); iter++) + if (cv::contourArea(*iter) > areaThre) + for (const auto& item : *iter) + maxContour.push_back(item); - return res; + convexHull(maxContour, maxContour); + + cv::RotatedRect box = cv::fitEllipse(maxContour); + + if (box.angle < -45) + { + box.angle += 90; + float temp = box.size.width; + box.size.width = box.size.height; + box.size.height = temp; + } + if (box.angle > 45) + { + box.angle -= 90; + float temp = box.size.width; + box.size.width = box.size.height; + box.size.height = temp; + } + areaThre = box.size.width / box.size.height; + return 0; } diff --git a/hgdriver/ImageProcess/CISTestImageProcess.h b/hgdriver/ImageProcess/CISTestImageProcess.h index 771d0c6..dc2fac0 100644 --- a/hgdriver/ImageProcess/CISTestImageProcess.h +++ b/hgdriver/ImageProcess/CISTestImageProcess.h @@ -50,6 +50,8 @@ private: static void findContours(const cv::Mat& src, std::vector>& contours, std::vector& hierarchy, int retr = cv::RETR_LIST, int method = cv::CHAIN_APPROX_SIMPLE, cv::Point offset = cv::Point(0, 0)); + static void convexHull(const std::vector& src, std::vector& dst, bool clockwise = false); + /// /// /// @@ -63,12 +65,8 @@ private: std::vector>& colorBlocks, std::vector>& grayBlocks); - /// - /// - /// - /// - /// - static int findMarks(const cv::Mat& image, std::vector& marks); + + static int findEllipse(const cv::Mat& image, double& scale_xy, double areaThre = 100 * 100); }; #endif \ No newline at end of file diff --git a/hgdriver/hgdev/hg_scanner_200.cpp b/hgdriver/hgdev/hg_scanner_200.cpp index 670b3ac..32ccf03 100644 --- a/hgdriver/hgdev/hg_scanner_200.cpp +++ b/hgdriver/hgdev/hg_scanner_200.cpp @@ -172,6 +172,7 @@ void hg_scanner_200::thread_handle_usb_read(void) ret = io_->read_bulk(&msg[0], &count); if (ret == SCANNER_ERR_OK) { + status_ = ret = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; char buf[1024]; strcpy(buf, msg.c_str()); notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); diff --git a/hgdriver/hgdev/hg_scanner_300.cpp b/hgdriver/hgdev/hg_scanner_300.cpp index 97deb26..a0059f3 100644 --- a/hgdriver/hgdev/hg_scanner_300.cpp +++ b/hgdriver/hgdev/hg_scanner_300.cpp @@ -152,9 +152,10 @@ void hg_scanner_300::thread_handle_usb_read(void) ret = io_->read_bulk(&msg[0], &count); if (ret == SCANNER_ERR_OK) { + status_= ret = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; char buf[1024]; strcpy(buf, msg.c_str()); - notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); + notify_ui_working_status(buf, SANE_EVENT_STATUS, status_); } else { @@ -339,12 +340,12 @@ int hg_scanner_300::get_scanner_status(USBCB &usb) int ret = SCANNER_ERR_OK; usb = { setting3288dsp::GET_DSP_STATUS, 0, 0}; - + io_->set_timeout(500); //蹇呰寤舵椂锛屼笖涓嶈兘灏忎簬杩欎釜鏁板 ret = writeusb(usb); if (ret != SCANNER_ERR_OK) return ret; - //io_->set_timeout(200); //蹇呰寤舵椂锛屼笖涓嶈兘灏忎簬杩欎釜鏁板 + io_->set_timeout(500); //蹇呰寤舵椂锛屼笖涓嶈兘灏忎簬杩欎釜鏁板 ret = readusb(usb); diff --git a/hgdriver/hgdev/hg_scanner_400.cpp b/hgdriver/hgdev/hg_scanner_400.cpp index 2b42037..acd619b 100644 --- a/hgdriver/hgdev/hg_scanner_400.cpp +++ b/hgdriver/hgdev/hg_scanner_400.cpp @@ -154,6 +154,7 @@ void hg_scanner_400::thread_handle_usb_read(void) ret = io_->read_bulk(&msg[0], &count); if (ret == SCANNER_ERR_OK) { + status_ = ret = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO; char buf[1024]; strcpy(buf, msg.c_str()); notify_ui_working_status(buf, SANE_EVENT_STATUS, status_);