diff --git a/include/sxGlobal.h b/include/sxGlobal.h new file mode 100644 index 0000000..908b9f3 --- /dev/null +++ b/include/sxGlobal.h @@ -0,0 +1,142 @@ +#pragma once +#include +#include +#include +#include +#include +#pragma region 基础函数 +#define CATCH_EXCEPTIONS \ + catch (HDevEngineCpp::HDevEngineException& ex) { \ + std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ + qDebug() << "HDevEngineException: " << ex.Message(); \ + } \ + catch (HalconCpp::HException& ex) { \ + std::cout << "Halcon Exception Caught!" << std::endl; \ + std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ + std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ + qDebug() << "Halcon Exception Caught!"; \ + qDebug() << "Error Code: " << ex.ErrorCode(); \ + qDebug() << "Error Message: " << ex.ErrorMessage(); \ + } \ + catch (const std::exception& e) { \ + std::cout << "Caught exception: " << e.what() << std::endl; \ + qDebug() << "Caught exception: " << e.what(); \ + } +struct sx_581_address { + int triggerAddr = -1; + int triggerValue = -1; + int snAddr = -1; + QByteArray completeAddr = "-1"; + QByteArray resultAddr = "-1"; + int valueOffsetAddr = -1; +}; + +class detParams { +public: + +}; +#pragma endregion + +//算法回调函数需è¦�包å�«å®Œæ•´çš„算法æµ�程以å�Šå�‘é€�ä¿¡å�·,å�‘é€�ui图表,æ�•获异常,处ç�†å¼‚常等æ“�作 +//并且注æ„� 异常å�¯èƒ½ä¼šå¯¼è‡´è¿�行ä¸�到å�‘é€�ä¿¡å�·çš„函数,请在处ç�†å¼‚常时å�‘é€�异常结果 +static bool generalAlgoTest(std::shared_ptr data, detParams* _detParams, sx_581_address address) { + try { + qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start"; + std::vector < std::string> defects = {"测试"}; + ///////////////////å�–图//处ç�†////////////////// + if (data->oriImgs.size() < 1) + { + qCritical() << "图片数é‡�ä¸�满足è¦�求:" << data->oriImgs.size(); + return false; + } + if (data->oriImgs[0].rows == 100) { + cv::Mat Paint; + data->oriImgs[0].copyTo(Paint); + cv::putText(Paint, "time out", cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255), 2); + return false; + } + + cv::Mat Paint; + QMutex paintMutex; + clock_t start, finish; + start = clock(); + cv::Mat src1 = data->oriImgs[0]; + if (src1.channels() != 3) + cv::cvtColor(src1, Paint, cv::COLOR_GRAY2BGR); + else + src1.copyTo(Paint); + + TextRendererZH textPainter(Paint.cols, Paint.rows, 15); + textPainter.putText(Paint, "划伤", cv::Point(10,10), cv::Scalar(0, 255, 0)); + cv::putText(Paint, "pos:" + data->additional["触å�‘地å�€"].toString().toStdString(), cv::Point(0, 50), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 0, 0), 2); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//å�‘é€�结果 + data->service->_missionResultHandle->handleAllResult(data->SNcode, !defects.size() > 0, defects);//å�‘é€�图标æ“�作 + data->resultImgs.push_back(Paint); + return true; + } + CATCH_EXCEPTIONS + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//å�‘é€�异常结果 + return false; +} +template +//此类适用于å�•相机多触å�‘地å�€å�•次判断的情况,比如密å°�钉,三å��机å�° +//例触å�‘地å�€æœ‰4个,输入信å�·ä¸º 1 0 0 1 则按顺åº�触å�‘1å’Œ4的地å�€æ‹�照检测,2å’Œ3ä¸�å�šå¤„ç�† +class _581_SX_Single_triggerTemplate { +public: + paramTemplte _detParams; + detCallbackChain* generalDet; + std::string cameraName; + QString viewerName; + std::vectoraddress; + /// + /// åˆ�始化 + /// + /// 相机å�� + /// 窗å�£å�� + /// 开始地å�€ + /// 触å�‘ä¿¡å�·æ•° + /// å�•次触å�‘调用几次相机模å�— + /// å�‚数输入 + /// 默认 + /// 默认 + /// 算法函数 + /// + void init(std::string cameraNameIn, QString viewerNameIN, std::vector addressIN, int oneTriggerCaptrueTimes, + paramTemplte& detParamsIn, ServiceManager* _serviceManagerIn, qtFuncBridge* bridgeIn, + typename detCallbackChain::processAlgoCallback _processAlgoCallback, + QString saveObjectNameIN = "") { + viewerName = viewerNameIN; + cameraName = cameraNameIn; + _serviceManager = _serviceManagerIn; + _detParams = detParamsIn; + bridge = bridgeIn; + address = addressIN; + saveObjectName = saveObjectNameIN; + generalDet = new detCallbackChain(_serviceManager, &_detParams, bridge); + generalDet->registerProcessAlgoCallback(_processAlgoCallback); + //å�•次触å�‘器æ�¡ä»¶ + for (int i = 0; i < addressIN.size(); i++) { + //注册å�•触å�‘器 触å�‘地å�€ç½®1时触å�‘ + _serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 1, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) { + evaluate(i, byteArray);}, ""); + } + + } + //获å�–图片并进行检测 + void evaluate(int batteryOffset, QByteArray& byteArray) { + _serviceManager->_triggerManager->writeShort("D" + QByteArray::number(address[0].triggerAddr) + "_0");//触å�‘ä¿¡å�·æ¸…é›¶ + std::string sn = _serviceManager->_triggerManager->readSnFromQByteArray(byteArray, address[batteryOffset].snAddr, false, false, -1); + auto camera = _serviceManager->_cameraManager->getCamera(cameraName);//获å�–相机 + camera->clearCache();//清除缓存 + std::shared_ptr data = _serviceManager->_detDataManager->createDetData( + QString::number(address[batteryOffset].triggerAddr), sn, 1, camera->config.oriSaveFormat);//创建数æ�®åŒ… + camera->captureImage(data);//æ‹�ç…§ + data->saveObjectName = saveObjectName; + generalDet->ansyncProcess(data, address[batteryOffset], ("D" + address[0].completeAddr + "_0"));//处ç�†ç®—法 并在å�–到图片å�Žå�‘é€�完æˆ�ä¿¡å�· + data->resultImgShowSet.push_back(showImgPack(viewerName, "结果图")); + } +private: + QString saveObjectName = ""; + qtFuncBridge* bridge; + ServiceManager* _serviceManager = nullptr; +}; \ No newline at end of file diff --git a/include/yhGlobal.h b/include/yhGlobal.h index 52657c6..ae354ab 100644 --- a/include/yhGlobal.h +++ b/include/yhGlobal.h @@ -218,7 +218,7 @@ public: //å�•次触å�‘器æ�¡ä»¶ for (int i = 0; i < triggerCount; i++) { //注册å�•触å�‘器 触å�‘地å�€ç½®1时触å�‘ - _serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 0, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) { + _serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 1, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) { evaluate(i, byteArray);}, ""); //注册清除完æˆ�ä¿¡å�·è§¦å�‘器 ä»»æ„�触å�‘地å�€å½’零时触å�‘一次 _serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 0, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) { diff --git a/src/core/back/detCallbackChain.hpp b/src/core/back/detCallbackChain.hpp index 05cd572..1e5e0d8 100644 --- a/src/core/back/detCallbackChain.hpp +++ b/src/core/back/detCallbackChain.hpp @@ -26,17 +26,18 @@ public: } //异步å�¯åŠ¨æ£€æµ‹ - void ansyncProcess(std::shared_ptr data, addressTemplate address = addressTemplate()) { - QFuture future = QtConcurrent::run([this, data, address]() { + void ansyncProcess(std::shared_ptr data, addressTemplate address, QByteArray completeSignal = "") { + QFuture future = QtConcurrent::run([this, data, address, completeSignal]() { process(data, address); }); } //å�¯åŠ¨æ£€æµ‹ - void process(std::shared_ptr data, addressTemplate address = addressTemplate()) { + void process(std::shared_ptr data, addressTemplate address, QByteArray completeSignal = "") { data->service = _serviceManager; while (data->oriImgs.size() < data->imgAmountMin) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + _triggerManager->writeShort(completeSignal); //等待图片满足è¦�求å�Žï¼Œå‚¨å­˜åŽŸå›¾ï¼Œå¼‚æ­¥æ‰§è¡Œç®—æ³•å‡½æ•° auto resultData = algoEvaluate(data, _handleAiModels, address); // ç¡®ä¿�线程安全退出 diff --git a/src/launcher/GUI/front/pages/summary_data_page.h b/src/launcher/GUI/front/pages/summaryDataPage.h similarity index 100% rename from src/launcher/GUI/front/pages/summary_data_page.h rename to src/launcher/GUI/front/pages/summaryDataPage.h diff --git a/src/launcher/GUI/mainwindow.h b/src/launcher/GUI/mainwindow.h index a680c63..615ed01 100644 --- a/src/launcher/GUI/mainwindow.h +++ b/src/launcher/GUI/mainwindow.h @@ -27,7 +27,7 @@ #include "front/pages/historyWidget.h" #include #include "front/pages/pluginManagerWidget.hpp" -#include "front/pages/summary_data_page.h" +#include "front/pages/summaryDataPage.h" #include #include #pragma execution_character_set("utf-8") diff --git a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h b/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h index 6e0b90e..8b6025d 100644 --- a/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h +++ b/src/mission/581-Mfd_yh_mh_hh/581-Mfd.h @@ -1,15 +1,59 @@ #include #include +#include "cal_disJiao.h" class mfd_detParams { public: int biaoding = 0; }; #pragma region 算法 + #include #include #include +# include "HalconCpp.h" using namespace HDevEngineCpp; +using namespace HalconCpp; + static bool ManHan(std::shared_ptr data, mfd_detParams* _detParams, yh_581_address address){ + HObject ho_in_image; + + HTuple hv_out_standardPar; + HTuple hv_out_flat; + HTuple in_ProductType; + HTuple hv_out_disLeftVertical; + HTuple hv_out_LeftVerticalLinePar; + HTuple hv_out_disLeftLevel; + HTuple hv_out_LeftLevelLinePar; + HTuple hv_out_disRightVertical; + HTuple hv_out_RightVerticalLinePar; + HTuple hv_out_disRightLevel; + HTuple hv_out_RightLevelLinePar; + cv::Mat img = cv::imread("D:/CCD/2025-10-04-19-57-14-928_04QCB6CJ27501JFA40006167_camera4_3.bmp", -1); + cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); + cv::threshold(img, img, 60, 255, cv::THRESH_BINARY); + std::vector> contours; + cv::findContours(img, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + if (contours.size() != 0) + { + for (int j = 0; j < contours.size(); j++) + { + cv::Rect rect = cv::boundingRect(contours[j]); + + if (rect.width > 1000 && rect.height > 900 ) + { + return true; + } + } + } + //cv::cvtColor(img, img, cv::COLOR_GRAY2BGR); + ho_in_image = MatToHObject(img); + in_ProductType = "181-2"; + cal_distanceJiao_4(ho_in_image, in_ProductType, &hv_out_standardPar, &hv_out_flat, + &hv_out_disLeftVertical, &hv_out_LeftVerticalLinePar, &hv_out_disLeftLevel, + &hv_out_LeftLevelLinePar, &hv_out_disRightVertical, &hv_out_RightVerticalLinePar, + &hv_out_disRightLevel, &hv_out_RightLevelLinePar); + int falg = hv_out_flat.I(); + return true; std::map sqlMapData; sqlMapData["项目"] = "上钉"; sqlMapData["相机"] = "相机" + address.triggerAddr; @@ -283,6 +327,8 @@ static bool YuHan(std::shared_ptr data, mfd_detParams* _detParams, yh_ return true; } + + #pragma endregion class _581_Mfd : public mission { public: diff --git a/src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h b/src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h new file mode 100644 index 0000000..be2cd91 --- /dev/null +++ b/src/mission/581-Mfd_yh_mh_hh/cal_disJiao.h @@ -0,0 +1,2903 @@ +/////////////////////////////////////////////////////////////////////////////// +// File generated by HDevelop for HALCON/C++ Version 18.05.0.1 +/////////////////////////////////////////////////////////////////////////////// + + +# include "HalconCpp.h" +//# include "HDevThread.h" +//#ifndef __APPLE__ +//# include "HalconCpp.h" +//# include "HDevThread.h" +//# if defined(__linux__) && !defined(__arm__) && !defined(NO_EXPORT_APP_MAIN) +//# include +//# endif +//#else +//# ifndef HC_LARGE_IMAGES +//# include +//# include +//# else +//# include +//# include +//# endif +//# include +//# include +//# include +//#endif +// + + +using namespace HalconCpp; + +// Procedure declarations +// External procedures +void cal_distanceJiao_4 (HObject ho_in_image, HTuple hv_in_ProductType, HTuple *hv_out_standardPar, + HTuple *hv_out_Flag, HTuple *hv_out_disLeftVertical, HTuple *hv_out_LeftVerticalLinePar, + HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, HTuple *hv_out_disRightVertical, + HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar); +void cal_left_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, + HObject ho_LeftContour, HTuple hv_in_ProductType, HTuple *hv_out_disLeftVertical, + HTuple *hv_out_LeftVerticalLinePar, HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, + HTuple *hv_out_standardPar, HTuple *hv_out_Flag); +void cal_Right_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, + HObject ho_RightXLD, HTuple hv_in_ProductType, HTuple *hv_out_disRightVertical, + HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar, + HTuple *hv_out_standardPar, HTuple *hv_out_Flag); +// Chapter: Graphics / Text +// Short Description: This procedure writes a text message. +void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem, + HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box); +// Chapter: XLD / Creation +// Short Description: Creates an arrow shaped XLD contour. +void gen_arrow_contour_xld (HObject *ho_Arrow, HTuple hv_Row1, HTuple hv_Column1, + HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth); +void Get_Rectangle2_Corner_new (HObject ho_Rectangle, HTuple *hv_out_Row, HTuple *hv_out_Col); +// Chapter: File / Misc +// Short Description: Get all image files under the given path +void list_image_files (HTuple hv_ImageDirectory, HTuple hv_Extensions, HTuple hv_Options, + HTuple *hv_ImageFiles); +// Chapter: File / Misc +// Short Description: Parse a filename into directory, base filename, and extension +void parse_filename (HTuple hv_FileName, HTuple *hv_BaseName, HTuple *hv_Extension, + HTuple *hv_Directory); +void pts_to_best_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Cols, HTuple hv_ActiveNum, + HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2); +void pts_to_smooth_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Columns, HTuple hv_ActiveNum, + HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2); +void rake (HObject ho_Image, HObject *ho_Regions, HTuple hv_Elements, HTuple hv_DetectHeight, + HTuple hv_DetectWidth, HTuple hv_Sigma, HTuple hv_Threshold, HTuple hv_Transition, + HTuple hv_Select, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2, HTuple hv_Column2, + HTuple *hv_ResultRow, HTuple *hv_ResultColumn); +// Chapter: Graphics / Text +// Short Description: Set font independent of OS +void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold, + HTuple hv_Slant); + +// Procedures +// External procedures +void cal_distanceJiao_4 (HObject ho_in_image, HTuple hv_in_ProductType, HTuple *hv_out_standardPar, + HTuple *hv_out_Flag, HTuple *hv_out_disLeftVertical, HTuple *hv_out_LeftVerticalLinePar, + HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, HTuple *hv_out_disRightVertical, + HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar) +{ + + // Local iconic variables + HObject ho_ImageCleared, ho_ImageSub, ho_Region3; + HObject ho_RegionOpening, ho_ConnectedRegions3, ho_RegionFillUp; + HObject ho_RegionOpening2, ho_ConnectedRegions1, ho_SelectedRegions3; + HObject ho_Partitioned, ho_SelectedRegions4, ho_RegionUnion1; + HObject ho_RegionMoved4, ho_Region1, ho_RegionMoved5, ho_Region; + HObject ho_RegionLines4, ho_RegionDilation5, ho_RegionDifference5; + HObject ho_ConnectedRegions6, ho_ProductRegion, ho_RegionDifference2; + HObject ho_RegionOpening1, ho_RegionLines2, ho_RegionDilation3; + HObject ho_RegionDifference3, ho_ConnectedRegions4, ho_SelectedRegions5; + HObject ho_RegionTrans, ho_RegionBorder, ho_Skeleton, ho_Contours1; + HObject ho_SmoothedContours, ho_ContoursSplit, ho_LineContour1; + HObject ho_LineContour, ho_LeftXLD, ho_LeftContour, ho_RegionLines3; + HObject ho_Contour1, ho_RegionDilation4, ho_RegionDifference4; + HObject ho_ConnectedRegions5, ho_SelectedRegions, ho_GlueRegions; + HObject ho_ImageReduced4, ho_ImageCleared1, ho_ImageSub1; + HObject ho_Region4, ho_RegionClosing1, ho_ConnectedRegions7; + HObject ho_SelectedRegions7, ho_Partitioned1, ho_SelectedRegions8; + HObject ho_WhiteRegion, ho_RightXLD, ho_RegionClosing2; + HObject ho_ConnectedRegions; + + // Local control variables + HTuple hv_Debug, hv_Gray, hv_clipHeight, hv_sel_Gray; + HTuple hv_sel_smallGray, hv_XLD_Lenth, hv_Width, hv_Height; + HTuple hv_W, hv_Number1, hv_Area1, hv_Row4, hv_Column4; + HTuple hv_RowBegin, hv_ColBegin, hv_RowEnd, hv_ColEnd; + HTuple hv_Nr, hv_Nc, hv_Dist, hv_row, hv_col, hv_k, hv_b; + HTuple hv_Row1, hv_Col1, hv_areaValue, hv_W1, hv_H1, hv_Value; + HTuple hv_out_standardPar1, hv_out_Flag1, hv_Number, hv_out_standardPar2; + HTuple hv_out_Flag2, hv_Exception; + + + + + (*hv_out_standardPar) = HTuple(); + (*hv_out_Flag) = 1; + + //×ó±ßÊúÖ±½º¾àÀë ¿í¡¾×îСֵ£¬×î´óÖµ¡¿ ¸ß¡¾×îСֵ£¬×î´óÖµ¡¿ ¡¾¾àÀë¶þ×îСֵ£¬¾àÀë¶þ×î´óÖµ£¬¾àÀëÒ»×îСֵ£¬¾àÀëÒ»×î´óÖµ¡¿ + (*hv_out_disLeftVertical) = HTuple(); + (*hv_out_LeftVerticalLinePar) = HTuple(); + //×ó±ßˮƽ½º¾àÀë ¿í¡¾×îСֵ£¬×î´óÖµ¡¿ ¸ß¡¾×îСֵ£¬×î´óÖµ¡¿ ¡¾¾àÀëÈý×îСֵ£¬¾àÀëÈý×î´óÖµ£¬¾àÀëËÄ×îСֵ£¬¾àÀëËÄ×î´óÖµ¡¿ + (*hv_out_disLeftLevel) = HTuple(); + (*hv_out_LeftLevelLinePar) = HTuple(); + + //ÓÒ±ßÊúÖ±½º¾àÀë ¿í¡¾×îСֵ£¬×î´óÖµ¡¿ ¸ß¡¾×îСֵ£¬×î´óÖµ¡¿ ¡¾¾àÀëÁù×îСֵ£¬¾àÀëÁù×î´óÖµ£¬¾àÀëÎå×îСֵ£¬¾àÀëÎå×î´óÖµ¡¿ + (*hv_out_disRightVertical) = HTuple(); + (*hv_out_RightVerticalLinePar) = HTuple(); + + //ÓÒ±ßˮƽ½º¾àÀë ¿í¡¾×îСֵ£¬×î´óÖµ¡¿ ¸ß¡¾×îСֵ£¬×î´óÖµ¡¿ ¡¾¾àÀëÆß×îСֵ£¬¾àÀëÆß×î´óÖµ£¬¾àÀë°Ë×îСֵ£¬¾àÀë°Ë×î´óÖµ¡¿ + (*hv_out_disRightLevel) = HTuple(); + (*hv_out_RightLevelLinePar) = HTuple(); + + if (HDevWindowStack::IsOpen()) + SetDraw(HDevWindowStack::GetActive(),"margin"); + hv_Debug = 1; + + //2024,05,24 V1.1 ºúºº±ø Ëã·¨µ÷Õû×ó²àÀ¶Ä¤µÄ¿í¶È¼ÆËã. + // V1.2 ºúºº±ø »ùÓÚ²»Í¬µÄÏßÌå, µ÷Õû´úÂë. + //2025,04,17 v1.3 ÓÅ»¯,µ÷Õû´úÂë + //2025,06,24 V1.4 + + if (0 != (hv_in_ProductType==HTuple("181-1"))) + { + hv_Gray = 60; + hv_clipHeight = 950; + hv_sel_Gray = 200; + hv_sel_smallGray = 210; + hv_XLD_Lenth = 100; + } + else if (0 != (hv_in_ProductType==HTuple("181-2"))) + { + //Gray := 70 + //clipHeight := 1000 + //sel_Gray := 215 + //sel_smallGray := 215 + //XLD_Lenth := 100 + hv_Gray = 60; + hv_clipHeight = 950; + hv_sel_Gray = 200; + hv_sel_smallGray = 210; + hv_XLD_Lenth = 100; + } + else if (0 != (hv_in_ProductType==HTuple("185-1"))) + { + hv_Gray = 40; + hv_clipHeight = 600; + hv_sel_Gray = 230; + hv_sel_smallGray = 210; + hv_XLD_Lenth = 200; + } + else if (0 != (hv_in_ProductType==HTuple("185-2"))) + { + //************************** + //ԭʼÊý¾Ý£¬±£Áô + hv_Gray = 50; + hv_clipHeight = 750; + hv_sel_Gray = 215; + hv_sel_smallGray = 195; + hv_XLD_Lenth = 200; + //***************************** + } + else if (0 != (hv_in_ProductType==HTuple("186-1"))) + { + hv_Gray = 40; + hv_clipHeight = 600; + hv_sel_Gray = 230; + hv_sel_smallGray = 215; + hv_XLD_Lenth = 200; + } + else if (0 != (hv_in_ProductType==HTuple("186-2"))) + { + hv_Gray = 40; + hv_clipHeight = 700; + hv_sel_Gray = 230; + hv_sel_smallGray = 200; + hv_XLD_Lenth = 400; + } + + //*********************************************************************** + try + { + GetImageSize(ho_in_image, &hv_Width, &hv_Height); + //step1: »ñÈ¡²øÈƵçоµÄÇøÓò. + GenImageProto(ho_in_image, &ho_ImageCleared, hv_Gray); + SubImage(ho_in_image, ho_ImageCleared, &ho_ImageSub, 5, -100); + Threshold(ho_ImageSub, &ho_Region3, 100, 255); + ClosingCircle(ho_Region3, &ho_RegionOpening, 25.5); + Connection(ho_RegionOpening, &ho_ConnectedRegions3); + FillUp(ho_ConnectedRegions3, &ho_RegionFillUp); + OpeningCircle(ho_RegionFillUp, &ho_RegionOpening2, 40.5); + Connection(ho_RegionOpening2, &ho_ConnectedRegions1); + SelectShapeStd(ho_ConnectedRegions1, &ho_SelectedRegions3, "max_area", 70); + RegionFeatures(ho_SelectedRegions3, "width", &hv_W); + PartitionRectangle(ho_SelectedRegions3, &ho_Partitioned, hv_W+10, 5); + SelectShape(ho_Partitioned, &ho_SelectedRegions4, "width", "and", (hv_W*0.5).TupleInt(), + hv_W+60); + Union1(ho_SelectedRegions4, &ho_RegionUnion1); + MoveRegion(ho_RegionUnion1, &ho_RegionMoved4, 0, 80); + Union2(ho_RegionUnion1, ho_RegionMoved4, &ho_Region1); + MoveRegion(ho_Region1, &ho_RegionMoved5, -5, 0); + Union2(ho_Region1, ho_RegionMoved5, &ho_Region); + + //¸Ã´¦²úÆ·µÄRegion½øÐвÃÇÐ, + //²ÎÊý1:²úÆ·µÄ²ÃÇÐλÖÃ, clipHeight:=200 + GenRegionLine(&ho_RegionLines4, hv_Height-hv_clipHeight, 0, hv_Height-hv_clipHeight, + hv_Width); + DilationRectangle1(ho_RegionLines4, &ho_RegionDilation5, 1, 30); + Difference(ho_Region, ho_RegionDilation5, &ho_RegionDifference5); + Connection(ho_RegionDifference5, &ho_ConnectedRegions6); + //²úÆ·µÄͼÏñ,×óÉϺÍÓÒÉϵĵã, ÓÃÓÚ¶¨Î»row×ø±ê. + SelectShapeStd(ho_ConnectedRegions6, &ho_ProductRegion, "max_area", 70); + //dev_display (in_image) + //dev_display (ProductRegion) + //stop () + //*********************************************************************** + + //*********************************************************************** + //step2£º »ñÈ¡²úÆ·¹¤×°µÄ±ßÔµÂÖÀª, ÓÃÓÚ²ÃÇÐ×óÓÒ²àµÄͼÏñ, + Difference(ho_SelectedRegions3, ho_Region, &ho_RegionDifference2); + ClosingCircle(ho_RegionDifference2, &ho_RegionOpening1, 200.5); + //dev_display (in_image) + //dev_display (RegionOpening1) + //³¢ÊÔ½«Í¼Ïñ½øÐзָî, »ñȡеÄÌØÕ÷µã + GenRegionLine(&ho_RegionLines2, 520, 0, 520, hv_Width-1); + DilationRectangle1(ho_RegionLines2, &ho_RegionDilation3, 1, 10); + Difference(ho_RegionOpening1, ho_RegionLines2, &ho_RegionDifference3); + Connection(ho_RegionDifference3, &ho_ConnectedRegions4); + SelectShapeStd(ho_ConnectedRegions4, &ho_SelectedRegions5, "max_area", 70); + + ShapeTrans(ho_SelectedRegions5, &ho_RegionTrans, "inner_rectangle1"); + Boundary(ho_RegionTrans, &ho_RegionBorder, "inner"); + Skeleton(ho_RegionBorder, &ho_Skeleton); + GenContoursSkeletonXld(ho_Skeleton, &ho_Contours1, 1, "filter"); + SmoothContoursXld(ho_Contours1, &ho_SmoothedContours, 5); + //½«ÂÖÀª½øÐÐÇиî, »ñÈ¡ÊúÖ±ÂÖÀª£¬ + SegmentContoursXld(ho_SmoothedContours, &ho_ContoursSplit, "lines", 10, 10, 4); + SelectContoursXld(ho_ContoursSplit, &ho_LineContour1, "direction", 1.3+3.1415, + 1.75+3.1415, -0.5, 0.5); + SelectContoursXld(ho_LineContour1, &ho_LineContour1, "contour_length", hv_XLD_Lenth, + 99999, -0.5, 0.5); + //¸Ã´¦½øÐб£»¤, ½«ÁÙ½üµÄÏß½øÐÐÁ¬½Ó, + UnionAdjacentContoursXld(ho_LineContour1, &ho_LineContour, 1000, 10, "attr_keep"); + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_LineContour1, HDevWindowStack::GetActive()); + //stop () + } + CountObj(ho_LineContour, &hv_Number1); + if (0 != (hv_Number1!=2)) + { + return; + } + //*********************************************************************** + + //*********************************************************************** + //step3: Ëã·¨»ñÈ¡×ó²àÀ¦½ºµÄ¶¨Î»µã, + AreaCenterPointsXld(ho_LineContour, &hv_Area1, &hv_Row4, &hv_Column4); + SelectShapeXld(ho_LineContour, &ho_LeftXLD, "column_points", "and", (hv_Column4.TupleMin())-1, + (hv_Column4.TupleMin())+1); + FitLineContourXld(ho_LeftXLD, "tukey", -1, 0, 5, 2, &hv_RowBegin, &hv_ColBegin, + &hv_RowEnd, &hv_ColEnd, &hv_Nr, &hv_Nc, &hv_Dist); + if (0 != ((hv_ColEnd-hv_ColBegin)==0)) + { + hv_row = hv_Height+400; + hv_col = hv_ColBegin; + } + else + { + //Éú³ÉÖ±Ïß·½³Ì, ÓÃÓÚ»ñȡȱÏÝµÄ + hv_k = (hv_RowEnd-hv_RowBegin)/(hv_ColEnd-hv_ColBegin); + hv_b = hv_RowBegin-(hv_k*hv_ColBegin); + hv_row = hv_Height+400; + hv_col = (hv_row-hv_b)/hv_k; + } + if (0 != (hv_RowBegin>hv_RowEnd)) + { + hv_Row1 = hv_RowEnd; + hv_Col1 = hv_ColEnd; + } + else + { + hv_Row1 = hv_RowBegin; + hv_Col1 = hv_ColBegin; + } + GenContourPolygonXld(&ho_LeftContour, hv_Row1.TupleConcat(hv_row), (hv_Col1-30).TupleConcat(hv_col-30)); + GenRegionLine(&ho_RegionLines3, hv_RowEnd, hv_ColEnd-30, hv_row, hv_col-30); + //µ÷ÊÔÓÃ, ¹Û²ì²âÊÔЧ¹û + if (0 != hv_Debug) + { + GenContourPolygonXld(&ho_Contour1, hv_RowEnd.TupleConcat(hv_row), hv_ColEnd.TupleConcat(hv_col)); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_RegionLines3, HDevWindowStack::GetActive()); + } + DilationRectangle1(ho_RegionLines3, &ho_RegionDilation4, 50, 1); + Difference(ho_ProductRegion, ho_RegionDilation4, &ho_RegionDifference4); + Connection(ho_RegionDifference4, &ho_ConnectedRegions5); + SelectShape(ho_ConnectedRegions5, &ho_SelectedRegions, "area", "and", 9999, 999999999999999999); + RegionFeatures(ho_SelectedRegions, "area", &hv_areaValue); + //»ñÈ¡À¦½ºÇøÓò(°üº¬µçо·¶Î§) + SelectShape(ho_SelectedRegions, &ho_GlueRegions, "area", "and", (hv_areaValue.TupleMin())-1, + (hv_areaValue.TupleMin())+1); + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); + //stop () + } + if (HDevWindowStack::IsOpen()) + SetDraw(HDevWindowStack::GetActive(),"margin"); + ReduceDomain(ho_in_image, ho_GlueRegions, &ho_ImageReduced4); + //¸Ã´¦»ùÓÚ²»Í¬µÄ²úÏß, ¹Û²ì²»Í¬µÄ»Ò¶È, ½øÐÐͳ¼Æ. + GenImageProto(ho_ImageReduced4, &ho_ImageCleared1, hv_sel_Gray); + SubImage(ho_ImageReduced4, ho_ImageCleared1, &ho_ImageSub1, 15, -100); + Threshold(ho_ImageSub1, &ho_Region4, 200, 255); + OpeningCircle(ho_Region4, &ho_RegionClosing1, 10.5); + Connection(ho_RegionClosing1, &ho_ConnectedRegions7); + SelectShapeStd(ho_ConnectedRegions7, &ho_SelectedRegions7, "max_area", 70); + //dev_display (in_image) + //dev_display (SelectedRegions7) + RegionFeatures(ho_SelectedRegions7, "width", &hv_W1); + RegionFeatures(ho_SelectedRegions7, "height", &hv_H1); + PartitionRectangle(ho_SelectedRegions7, &ho_Partitioned1, hv_W1+100, 4); + RegionFeatures(ho_Partitioned1, "width", &hv_Value); + SelectShape(ho_Partitioned1, &ho_SelectedRegions8, "width", "and", (hv_Value.TupleMax())-200, + (hv_Value.TupleMax())+10); + Union1(ho_SelectedRegions8, &ho_WhiteRegion); + //*********************************************************************** + //×Óº¯Êý:¼ÆËã×ó²àÀ¦½ºµÄ¾àÀë + cal_left_Distance(ho_in_image, ho_GlueRegions, ho_WhiteRegion, ho_LeftContour, + hv_in_ProductType, &(*hv_out_disLeftVertical), &(*hv_out_LeftVerticalLinePar), + &(*hv_out_disLeftLevel), &(*hv_out_LeftLevelLinePar), &hv_out_standardPar1, + &hv_out_Flag1); + if (0 != (hv_out_Flag1==1)) + { + return; + } + //*********************************************************************** + //step4: Ëã·¨»ñÈ¡ÓÒ²àÀ¦½ºµÄ¶¨Î»µã, + //area_center_xld (LineContour, Area1, Row4, Column4, PointOrder) + //select_shape_xld (LineContour, RightXLD, 'column', 'and', max(Column4)-1, max(Column4)+1) + AreaCenterPointsXld(ho_LineContour, &hv_Area1, &hv_Row4, &hv_Column4); + SelectShapeXld(ho_LineContour, &ho_RightXLD, "column_points", "and", (hv_Column4.TupleMax())-1, + (hv_Column4.TupleMax())+1); + //dev_display (in_image) + //dev_display (RightXLD) + FitLineContourXld(ho_RightXLD, "tukey", -1, 0, 5, 2, &hv_RowBegin, &hv_ColBegin, + &hv_RowEnd, &hv_ColEnd, &hv_Nr, &hv_Nc, &hv_Dist); + if (0 != ((hv_ColEnd-hv_ColBegin)==0)) + { + hv_row = hv_Height-1; + hv_col = hv_ColEnd; + } + else + { + hv_k = (hv_RowEnd-hv_RowBegin)/(hv_ColEnd-hv_ColBegin); + hv_b = hv_RowBegin-(hv_k*hv_ColBegin); + hv_row = hv_Height+400; + hv_col = (hv_row-hv_b)/hv_k; + } + + if (0 != (hv_RowBegin>hv_RowEnd)) + { + hv_Row1 = hv_RowEnd; + hv_Col1 = hv_ColEnd; + } + else + { + hv_Row1 = hv_RowBegin; + hv_Col1 = hv_ColBegin; + } + + GenRegionLine(&ho_RegionLines3, hv_Row1, hv_Col1+30, hv_row, hv_col+30); + GenContourPolygonXld(&ho_RightXLD, hv_Row1.TupleConcat(hv_row), (hv_Col1+30).TupleConcat(hv_col+30)); + //µ÷ÊÔÓÃ, ¹Û²ì²âÊÔЧ¹û + if (0 != hv_Debug) + { + //gen_contour_polygon_xld (Contour1, [RowBegin,row], [ColEnd,col]) + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_RegionLines3, HDevWindowStack::GetActive()); + } + DilationRectangle1(ho_RegionLines3, &ho_RegionDilation4, 10, 1); + Difference(ho_ProductRegion, ho_RegionDilation4, &ho_RegionDifference4); + Connection(ho_RegionDifference4, &ho_ConnectedRegions5); + RegionFeatures(ho_ConnectedRegions5, "area", &hv_areaValue); + //»ñÈ¡À¦½ºÇøÓò(°üº¬µçо·¶Î§) + SelectShape(ho_ConnectedRegions5, &ho_GlueRegions, "area", "and", (hv_areaValue.TupleMin())-1, + (hv_areaValue.TupleMin())+1); + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); + //stop () + } + //************************************************** + //dev_set_draw ('margin') + ReduceDomain(ho_in_image, ho_GlueRegions, &ho_ImageReduced4); + GenImageProto(ho_ImageReduced4, &ho_ImageCleared1, hv_sel_smallGray); + SubImage(ho_ImageReduced4, ho_ImageCleared1, &ho_ImageSub1, 10, -100); + Threshold(ho_ImageSub1, &ho_Region4, 200, 255); + ClosingCircle(ho_Region4, &ho_RegionClosing2, 1.5); + OpeningCircle(ho_RegionClosing2, &ho_RegionClosing1, 10.5); + Connection(ho_RegionClosing1, &ho_ConnectedRegions7); + SelectShapeStd(ho_ConnectedRegions7, &ho_SelectedRegions7, "max_area", 70); + //dev_display (in_image) + //dev_display (SelectedRegions7) + RegionFeatures(ho_SelectedRegions7, "width", &hv_W1); + RegionFeatures(ho_SelectedRegions7, "height", &hv_H1); + PartitionRectangle(ho_SelectedRegions7, &ho_Partitioned1, hv_W1+100, 4); + RegionFeatures(ho_Partitioned1, "width", &hv_Value); + SelectShape(ho_Partitioned1, &ho_SelectedRegions8, "width", "and", (hv_Value.TupleMax())-250, + (hv_Value.TupleMax())+10); + Union1(ho_SelectedRegions8, &ho_WhiteRegion); + Connection(ho_WhiteRegion, &ho_ConnectedRegions); + CountObj(ho_ConnectedRegions, &hv_Number); + if (0 != (hv_Number>1)) + { + Union1(ho_ConnectedRegions, &ho_WhiteRegion); + //select_shape_std (ConnectedRegions, WhiteRegion, 'max_area', 70) + } + //¿¼ÂÇ: ÓÉÓڻҽײ»Í³Ò», µ¼Ö°×É«Ä¤ÇøÓòûÓÐÌáÈ¡ÍêÈ«, ¿¼ÂǽøÐÐÓÅ»¯; + + //×Óº¯Êý: ¼ÆËãÓÒ²àÏߵľàÀë, + cal_Right_Distance(ho_in_image, ho_GlueRegions, ho_WhiteRegion, ho_RightXLD, + hv_in_ProductType, &(*hv_out_disRightVertical), &(*hv_out_RightVerticalLinePar), + &(*hv_out_disRightLevel), &(*hv_out_RightLevelLinePar), &hv_out_standardPar2, + &hv_out_Flag2); + int fflag1 = hv_out_Flag1.D(), fflag2 = hv_out_Flag2.D(); + if (0 != (hv_out_Flag2==1)) + { + return; + } + + + + if (0 != (HTuple(HTuple(HTuple(hv_out_Flag1==0).TupleAnd(hv_out_Flag2==0)).TupleAnd((hv_out_standardPar1.TupleLength())==8)).TupleAnd((hv_out_standardPar2.TupleLength())==8))) + { + //Êý¾Ý½øÐлã×Ü, + (*hv_out_Flag) = 0; + (*hv_out_standardPar).Clear(); + (*hv_out_standardPar).Append(hv_out_standardPar1); + (*hv_out_standardPar).Append(hv_out_standardPar2); + } + //*********************************************************************** + } + // catch (Exception) + catch (HException &HDevExpDefaultException) + { + HDevExpDefaultException.ToHTuple(&hv_Exception); + std::string str = hv_Exception.ToString(); + } + return; +} + +void cal_left_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, + HObject ho_LeftContour, HTuple hv_in_ProductType, HTuple *hv_out_disLeftVertical, + HTuple *hv_out_LeftVerticalLinePar, HTuple *hv_out_disLeftLevel, HTuple *hv_out_LeftLevelLinePar, + HTuple *hv_out_standardPar, HTuple *hv_out_Flag) +{ + + // Local iconic variables + HObject ho_RegionMoved, ho_RegionTrans, ho_RegionDilation; + HObject ho_ImageReduced, ho_ImageEmphasize, ho_Cross, ho_Cross1; + HObject ho_Cross2, ho_Cross3, ho_Regions1, ho_L_Line1, ho_Regions2; + HObject ho_L_Line2, ho_Line, ho_Contour2, ho_V_Regions2; + HObject ho_V_Line2, ho_V_Regions1, ho_V_Line1, ho_Rectangle; + HObject ho_ImageReduced1, ho_EdgeAmplitude, ho_ImageAbs; + HObject ho_ImageScaled, ho_Region, ho_RegionClosing, ho_ConnectedRegions; + HObject ho_SelectedRegions1, ho_ObjectSelected, ho_RegionTrans1; + HObject ho_L_Regions3, ho_L_Line3, ho_Rectangle1, ho_ImageCleared; + HObject ho_ImageSub, ho_ImageGauss, ho_RegionIntersection; + HObject ho_RegionLines1, ho_RegionLines2, ho_Cross5, ho_Cross6; + HObject ho_Contour, ho_Region1, ho_ImageReduced2, ho_EdgeAmplitude1; + HObject ho_ImageAbs1, ho_ImageScaled1, ho_SelectedRegions; + HObject ho_V_Regions3, ho_V_Line3; + + // Local control variables + HTuple hv_Debug, hv_Newtuple, hv_clip_Row1, hv_clip_Row2; + HTuple hv_clip_Row, hv_insideRow, hv_insideCol, hv_outsideRow; + HTuple hv_outsideCol, hv_L_ResultRow1, hv_L_ResultColumn1; + HTuple hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11, hv_L_ResultRow2; + HTuple hv_L_ResultColumn2, hv_L_Row2, hv_L_Col2, hv_L_Row22; + HTuple hv_L_Col22, hv_ResultRow2, hv_ResultColumn2, hv_Row11; + HTuple hv_Column11, hv_Row21, hv_Column21, hv_Angle, hv_k; + HTuple hv_b, hv_row, hv_col, hv_V_ResultRow2, hv_V_ResultColumn2; + HTuple hv_V_Row2, hv_V_Col2, hv_V_Row22, hv_V_Col22, hv_V_ResultRow1; + HTuple hv_V_ResultColumn1, hv_V_Row1, hv_V_Column1, hv_V_Row11; + HTuple hv_V_Column11, hv_Value, hv_Value1, hv_Indices; + HTuple hv_Symbol, hv_index1, hv_N, hv_X, hv_Row, hv_Col; + HTuple hv_L_ResultRow3, hv_L_ResultColumn3, hv_L_Row3; + HTuple hv_L_Column3, hv_L_Row33, hv_L_Column33, hv_Row12; + HTuple hv_Column12, hv_Row22, hv_Column22, hv_Mean, hv_Deviation; + HTuple hv_Row1, hv_Column1, hv_IsOverlapping, hv_Row2; + HTuple hv_Column2, hv_IsOverlapping1, hv_Row3, hv_Column3; + HTuple hv_IsOverlapping2, hv_Row4, hv_Column4, hv_Symbol1; + HTuple hv_Col1, hv_V_ResultRow3, hv_V_ResultColumn3, hv_DistanceMin; + HTuple hv_DistanceMax, hv_V_Row3, hv_V_Column3, hv_V_Row33; + HTuple hv_V_Column33, hv_Distance1, hv_Sorted1, hv_Selected1; + HTuple hv_Selected2, hv_Distance2, hv_Sorted2, hv_Selected3; + HTuple hv_Selected4, hv_Distance3, hv_Sorted3, hv_Selected5; + HTuple hv_Selected6, hv_Distance4, hv_Sorted4, hv_Selected7; + HTuple hv_Selected8, hv_Exception; + + + //ÎÊÌâµã: À¶Ä¤µÄ±ßÔµµã´æÔÚ¶¨Î»²»×¼µÄÎÊÌâ. + hv_Debug = 0; + TupleGenConst(16, 0, &hv_Newtuple); + (*hv_out_disLeftVertical) = HTuple(); + (*hv_out_LeftVerticalLinePar) = HTuple(); + (*hv_out_disLeftLevel) = HTuple(); + (*hv_out_LeftLevelLinePar) = HTuple(); + (*hv_out_standardPar) = HTuple(); + (*hv_out_Flag) = 1; + if (0 != (hv_in_ProductType==HTuple("181-1"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 1050; + hv_clip_Row = -25; + } + else if (0 != (hv_in_ProductType==HTuple("181-2"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 1050; + hv_clip_Row = -25; + } + else if (0 != (hv_in_ProductType==HTuple("185-1"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 940; + hv_clip_Row = -60; + } + else if (0 != (hv_in_ProductType==HTuple("185-2"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 900; + hv_clip_Row = -25; + } + else if (0 != (hv_in_ProductType==HTuple("186-1"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = -150; + hv_clip_Row = -25; + } + else if (0 != (hv_in_ProductType==HTuple("186-2"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 450; + hv_clip_Row = -10; + } + + try + { + //Ô¤´¦Àí,ÔöÇ¿ÓÒ²à²øÈÆµçоµÄ»Ò½×²î. + MoveRegion(ho_GlueRegions, &ho_RegionMoved, -180, 0); + Intersection(ho_GlueRegions, ho_RegionMoved, &ho_GlueRegions); + ShapeTrans(ho_GlueRegions, &ho_RegionTrans, "rectangle2"); + DilationRectangle1(ho_RegionTrans, &ho_RegionDilation, 600, 600); + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_RegionDilation, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + + ReduceDomain(ho_in_image, ho_RegionDilation, &ho_ImageReduced); + Emphasize(ho_in_image, &ho_ImageEmphasize, 7, 7, 1); + //*********************************************************************** + //step3.2 Ëã·¨»ñÈ¡×ó²àµÄ¶¨Î»µã, + //»ñÈ¡ÄÚ²à°üĤµÄËĸöµãλ + Get_Rectangle2_Corner_new(ho_WhiteRegion, &hv_insideRow, &hv_insideCol); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross, hv_insideRow, hv_insideCol, 35, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_WhiteRegion, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross, HDevWindowStack::GetActive()); + + //gen_cross_contour_xld (Cross1, insideRow[0], insideCol[0], 65, rad(45)) + //gen_cross_contour_xld (Cross2, insideRow[1], insideCol[1], 65, rad(45)) + //gen_cross_contour_xld (Cross3, insideRow[2], insideCol[2], 65, rad(45)) + //gen_cross_contour_xld (Cross4, insideRow[3], insideCol[3], 65, rad(45)) + //dev_display (in_image) + + //dev_display (Cross1) + //dev_display (Cross2) + //dev_display (Cross3) + //dev_display (Cross4) + //stop () + } + //»ñÈ¡Íâ²à°üĤµÄËĸöµãλ, + Get_Rectangle2_Corner_new(ho_GlueRegions, &hv_outsideRow, &hv_outsideCol); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross, hv_outsideRow, hv_outsideCol, 35, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_GlueRegions, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //*********************************************************************** + + //*********************************************************************** + //step3.3 ץȡÓÒ²à°üĤµÄÂÖÀªµã, + //step3.3.1 ץȡˮƽÂÖÀªÒ», + rake(ho_ImageEmphasize, &ho_Regions1, 150, 280, 5, 1, 8, "positive", "first", + HTuple(hv_outsideRow[1]), HTuple(hv_outsideCol[1]), HTuple(hv_outsideRow[0]), + HTuple(hv_outsideCol[0]), &hv_L_ResultRow1, &hv_L_ResultColumn1); + if (0 != ((hv_L_ResultRow1.TupleLength())<10)) + { + return; + } + pts_to_smooth_line(&ho_L_Line1, hv_L_ResultRow1, hv_L_ResultColumn1, 5, &hv_L_Row1, + &hv_L_Col1, &hv_L_Row11, &hv_L_Col11); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_L_ResultRow1, hv_L_ResultColumn1, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_ImageEmphasize, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Regions1, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line1, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //step3.3.2 ץȡˮƽÂÖÀª¶þ, + //ץȡˮƽÏß2, + rake(ho_in_image, &ho_Regions2, 250, 480, 5, 1, 8, "negative", "first", HTuple(hv_insideRow[0]), + HTuple(hv_insideCol[0]), HTuple(hv_insideRow[1]), HTuple(hv_insideCol[1]), + &hv_L_ResultRow2, &hv_L_ResultColumn2); + if (0 != ((hv_L_ResultRow2.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_L_Line2, hv_L_ResultRow2, hv_L_ResultColumn2, 5, &hv_L_Row2, + &hv_L_Col2, &hv_L_Row22, &hv_L_Col22); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_L_ResultRow2, hv_L_ResultColumn2, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Regions2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line2, HDevWindowStack::GetActive()); + } + + //step3.3.2 ץȡÊúÖ±°üĤµÄ±ßÔµ¶þ + //ץȡÊúÖ±°üĤµÄ²¿·Ö±ßÔµ,ÓÃÓÚÉú³É¸¨ÖúÏß, + rake(ho_in_image, &ho_Regions2, 100, 250, 5, 1, 8, "negative", "first", HTuple(hv_insideRow[2]), + HTuple(hv_insideCol[2]), HTuple(hv_insideRow[0]), HTuple(hv_insideCol[0]), + &hv_ResultRow2, &hv_ResultColumn2); + if (0 != ((hv_ResultRow2.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_Line, hv_ResultRow2, hv_ResultColumn2, 5, &hv_Row11, &hv_Column11, + &hv_Row21, &hv_Column21); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_ResultRow2, hv_ResultColumn2, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Regions2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Line, HDevWindowStack::GetActive()); + } + + //¸Ã´¦ÐÂÔö½Ç¶ÈÅжÏ, Èç¹û½Ç¶È¹ý´ó, ÀûÓÃÔöÇ¿ºóµÄͼÏñ, ½øÐжþ´Î×¥±ß. + AngleLx(hv_Row11, hv_Column11, hv_Row21, hv_Column21, &hv_Angle); + + hv_k = (hv_Row11-hv_Row21)/(hv_Column11-hv_Column21); + hv_b = hv_Row11-(hv_k*hv_Column11); + hv_row = hv_Row11+750; + hv_col = (hv_row-hv_b)/hv_k; + if (0 != hv_Debug) + { + GenContourPolygonXld(&ho_Contour2, hv_Row21.TupleConcat(hv_row), hv_Column21.TupleConcat(hv_col)); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Contour2, HDevWindowStack::GetActive()); + } + rake(ho_in_image, &ho_V_Regions2, 150, 100, 5, 1, 15, "negative", "first", hv_row, + hv_col, hv_Row21, hv_Column21, &hv_V_ResultRow2, &hv_V_ResultColumn2); + if (0 != ((hv_V_ResultRow2.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_V_Line2, hv_V_ResultRow2, hv_V_ResultColumn2, 2, &hv_V_Row2, + &hv_V_Col2, &hv_V_Row22, &hv_V_Col22); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross3, hv_V_ResultRow2, hv_V_ResultColumn2, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_ImageEmphasize, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Line2, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //step3.3.3 ץȡÊúÖ±°üĤµÄ±ßÔµÒ» + rake(ho_in_image, &ho_V_Regions1, 200, 450, 5, 1, 15, "positive", "first", HTuple(hv_outsideRow[0]), + HTuple(hv_outsideCol[0]), hv_V_Row2, HTuple(hv_outsideCol[0]), &hv_V_ResultRow1, + &hv_V_ResultColumn1); + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions1, HDevWindowStack::GetActive()); + + } + + if (0 != ((hv_V_ResultRow1.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_V_Line1, hv_V_ResultRow1, hv_V_ResultColumn1, 5, &hv_V_Row1, + &hv_V_Column1, &hv_V_Row11, &hv_V_Column11); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_V_ResultRow1, hv_V_ResultColumn1, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions1, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Line1, HDevWindowStack::GetActive()); + } + //**************************************** + + //_______________________________________________________ + //step3.3.4 ץȡˮƽ°üĤµÄ±ßÔµÈý + + //¸Ã´¦µÄ²ÎÊý½øÐе÷Õû,»ñÈ¡ÕæÊµµÄ²úÆ·±ßÔµ, + //¸Ã´¦²ÎÊý½øÐпª·Å, »ùÓÚ²»Í¬µÄ²úÆ·½øÐе÷Õû, + + if (0 != (HTuple(hv_in_ProductType==HTuple("181-1")).TupleOr(hv_in_ProductType==HTuple("181-2")))) + { + //gen_cross_contour_xld (Cross4, insideRow[2]+clip_Row2, outsideCol[2]+500, 35, rad(45)) + //gen_cross_contour_xld (Cross7, insideRow[2]+clip_Row1, insideCol[2]-400, 35, rad(45)) + //dev_display (in_image) + //dev_display (Cross4) + //dev_display (Cross7) + + + GenRectangle1(&ho_Rectangle, HTuple(hv_insideRow[2])+hv_clip_Row1, HTuple(hv_insideCol[2])-400, + HTuple(hv_insideRow[2])+hv_clip_Row2, HTuple(hv_outsideCol[2])+500); + } + else + { + GenRectangle1(&ho_Rectangle, HTuple(hv_insideRow[2])+hv_clip_Row1, HTuple(hv_insideCol[2])-350, + HTuple(hv_insideRow[2])+hv_clip_Row2, HTuple(hv_outsideCol[2])+350); + } + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Rectangle, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_WhiteRegion, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + + ReduceDomain(ho_in_image, ho_Rectangle, &ho_ImageReduced1); + SobelAmp(ho_ImageReduced1, &ho_EdgeAmplitude, "y", 3); + AbsImage(ho_EdgeAmplitude, &ho_ImageAbs); + ScaleImage(ho_ImageAbs, &ho_ImageScaled, 15, -120); + Threshold(ho_ImageScaled, &ho_Region, 50, 255); + ClosingRectangle1(ho_Region, &ho_RegionClosing, 100, 2); + Connection(ho_RegionClosing, &ho_ConnectedRegions); + RegionFeatures(ho_ConnectedRegions, "width", &hv_Value); + SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "width", "and", 20, 99999); + RegionFeatures(ho_SelectedRegions1, "width", &hv_Value1); + TupleSortIndex(hv_Value1, &hv_Indices); + hv_Symbol = 0; + { + HTuple end_val228 = hv_Indices.TupleLength(); + HTuple step_val228 = 1; + for (hv_index1=1; hv_index1.Continue(end_val228, step_val228); hv_index1 += step_val228) + { + hv_N = hv_Value1.TupleLength(); + hv_X = HTuple(hv_Indices[hv_N-hv_index1]); + SelectObj(ho_SelectedRegions1, &ho_ObjectSelected, hv_X+1); + ShapeTrans(ho_ObjectSelected, &ho_RegionTrans1, "rectangle1"); + Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); + GenCrossContourXld(&ho_Cross1, hv_Row, hv_Col, 6, 0.785398); + //dev_display (in_image) + //dev_display (Cross1) + rake(ho_in_image, &ho_L_Regions3, 100, 150, 2, 1, 8, "negative", "first", HTuple(hv_Row[2]), + HTuple(hv_Col[2]), HTuple(hv_Row[3]), HTuple(hv_Col[3]), &hv_L_ResultRow3, + &hv_L_ResultColumn3); + if (0 != ((hv_L_ResultRow3.TupleLength())<10)) + { + continue; + } + pts_to_smooth_line(&ho_L_Line3, hv_L_ResultRow3, hv_L_ResultColumn3, 10, &hv_L_Row3, + &hv_L_Column3, &hv_L_Row33, &hv_L_Column33); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_L_ResultRow3, hv_L_ResultColumn3, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line3, HDevWindowStack::GetActive()); + } + hv_Symbol = 1; + break; + } + } + if (0 != (hv_Symbol==0)) + { + ReduceDomain(ho_in_image, ho_Rectangle, &ho_ImageReduced1); + + SmallestRectangle1(ho_Rectangle, &hv_Row12, &hv_Column12, &hv_Row22, &hv_Column22); + GenRectangle1(&ho_Rectangle1, hv_Row22-100, hv_Column22-100, hv_Row22, hv_Column22); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Rectangle1, HDevWindowStack::GetActive()); + Intensity(ho_Rectangle1, ho_ImageReduced1, &hv_Mean, &hv_Deviation); + GenImageProto(ho_in_image, &ho_ImageCleared, (hv_Mean.TupleInt())*0.5); + SubImage(ho_in_image, ho_ImageCleared, &ho_ImageSub, 6, 0); + + GaussFilter(ho_ImageSub, &ho_ImageGauss, 9); + SobelAmp(ho_ImageGauss, &ho_EdgeAmplitude, "y", 3); + AbsImage(ho_EdgeAmplitude, &ho_ImageAbs); + ScaleImage(ho_ImageAbs, &ho_ImageScaled, 17, -120); + Threshold(ho_ImageScaled, &ho_Region, 50, 255); + Intersection(ho_Region, ho_Rectangle, &ho_RegionIntersection); + + ClosingRectangle1(ho_RegionIntersection, &ho_RegionClosing, 100, 2); + Connection(ho_RegionClosing, &ho_ConnectedRegions); + RegionFeatures(ho_ConnectedRegions, "width", &hv_Value); + SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "width", "and", 20, + 99999); + RegionFeatures(ho_SelectedRegions1, "width", &hv_Value1); + TupleSortIndex(hv_Value1, &hv_Indices); + hv_Symbol = 0; + { + HTuple end_val280 = hv_Indices.TupleLength(); + HTuple step_val280 = 1; + for (hv_index1=1; hv_index1.Continue(end_val280, step_val280); hv_index1 += step_val280) + { + hv_N = hv_Value1.TupleLength(); + hv_X = HTuple(hv_Indices[hv_N-hv_index1]); + SelectObj(ho_SelectedRegions1, &ho_ObjectSelected, hv_X+1); + ShapeTrans(ho_ObjectSelected, &ho_RegionTrans1, "rectangle1"); + Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); + GenCrossContourXld(&ho_Cross1, hv_Row, hv_Col, 6, 0.785398); + //dev_display (RegionTrans1) + //dev_display (Cross1) + rake(ho_ImageSub, &ho_L_Regions3, 100, 150, 2, 1, 10, "negative", "first", + HTuple(hv_Row[2]), HTuple(hv_Col[2]), HTuple(hv_Row[3]), HTuple(hv_Col[3]), + &hv_L_ResultRow3, &hv_L_ResultColumn3); + if (0 != ((hv_L_ResultRow3.TupleLength())<10)) + { + continue; + } + pts_to_smooth_line(&ho_L_Line3, hv_L_ResultRow3, hv_L_ResultColumn3, 10, + &hv_L_Row3, &hv_L_Column3, &hv_L_Row33, &hv_L_Column33); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_L_ResultRow3, hv_L_ResultColumn3, 7, + HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line3, HDevWindowStack::GetActive()); + } + hv_Symbol = 1; + break; + } + } + } + if (0 != (hv_Symbol==0)) + { + return; + } + //________________________________________________________ + //step3.3.4 ץȡˮƽ°üĤµÄ±ßÔµÈý + IntersectionLineContourXld(ho_LeftContour, hv_L_Row1, hv_L_Col1, hv_L_Row11, + hv_L_Col11, &hv_Row1, &hv_Column1, &hv_IsOverlapping); + IntersectionLineContourXld(ho_LeftContour, hv_L_Row2, hv_L_Col2, hv_L_Row22, + hv_L_Col22, &hv_Row2, &hv_Column2, &hv_IsOverlapping1); + + if (0 != hv_Debug) + { + GenRegionLine(&ho_RegionLines1, hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11); + GenRegionLine(&ho_RegionLines2, hv_L_Row2, hv_L_Col2, hv_L_Row22, hv_L_Col22); + + //gen_cross_contour_xld (Cross4, Row1, Column1, 30, 0.785398) + //gen_cross_contour_xld (Cross5, Row2, Column2, 30, 0.785398) + //dev_display (in_image) + //dev_display (Cross4) + //dev_display (Cross5) + //dev_display (LeftContour) + //dev_display (RegionLines1) + //dev_display (RegionLines2) + //stop () + } + //¸Ã´¦²ÎÊýÒ²¿ÉÒÔ¿¼ÂǽøÐпª·Å, + IntersectionLines(hv_Row1, hv_Column1-600, hv_Row2, hv_Column2-600, hv_L_Row1, + hv_L_Col1, hv_L_Row11, hv_L_Col11, &hv_Row3, &hv_Column3, &hv_IsOverlapping2); + IntersectionLines(hv_Row1, hv_Column1-600, hv_Row2, hv_Column2-600, hv_L_Row2, + hv_L_Col2, hv_L_Row22, hv_L_Col22, &hv_Row4, &hv_Column4, &hv_IsOverlapping2); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross5, hv_Row3, hv_Column3, 30, 0.785398); + GenCrossContourXld(&ho_Cross6, hv_Row4, hv_Column4, 30, 0.785398); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross5, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross6, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + + //¸Ã´¦½øÐе÷Õû²ÎÊý, + GenContourPolygonXld(&ho_Contour, (((hv_Row1.TupleConcat(hv_Row2)).TupleConcat(hv_Row4)).TupleConcat(hv_Row3)).TupleConcat(hv_Row1), + ((((hv_Column1+hv_clip_Row).TupleConcat(hv_Column2+hv_clip_Row)).TupleConcat(hv_Column4)).TupleConcat(hv_Column3)).TupleConcat(hv_Column1+hv_clip_Row)); + GenRegionContourXld(ho_Contour, &ho_Region1, "filled"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Region1, HDevWindowStack::GetActive()); + + ReduceDomain(ho_in_image, ho_Region1, &ho_ImageReduced2); + SobelAmp(ho_ImageReduced2, &ho_EdgeAmplitude1, "x", 3); + AbsImage(ho_EdgeAmplitude1, &ho_ImageAbs1); + ScaleImage(ho_ImageAbs1, &ho_ImageScaled1, 15, -120); + Threshold(ho_ImageScaled1, &ho_Region1, 50, 255); + ClosingRectangle1(ho_Region1, &ho_RegionClosing, 15, 180); + Connection(ho_RegionClosing, &ho_ConnectedRegions); + RegionFeatures(ho_ConnectedRegions, "height", &hv_Value1); + SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "height", "and", 20, 99999); + RegionFeatures(ho_SelectedRegions1, "height", &hv_Value1); + + TupleSortIndex(hv_Value1, &hv_Indices); + hv_Symbol1 = 0; + { + HTuple end_val361 = hv_Indices.TupleLength(); + HTuple step_val361 = 1; + for (hv_index1=1; hv_index1.Continue(end_val361, step_val361); hv_index1 += step_val361) + { + hv_N = hv_Value1.TupleLength(); + hv_X = HTuple(hv_Indices[hv_N-hv_index1]); + SelectObj(ho_SelectedRegions1, &ho_SelectedRegions, hv_X+1); + ShapeTrans(ho_SelectedRegions, &ho_RegionTrans1, "rectangle1"); + Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row1, &hv_Col1); + //gen_cross_contour_xld (Cross1, Row, Col, 6, 0.785398) + //dev_display (RegionTrans1) + //dev_display (Cross1) + rake(ho_in_image, &ho_V_Regions3, 50, 150, 5, 1, 6, "positive", "first", HTuple(hv_Row1[1]), + (HTuple(hv_Col1[1])+HTuple(hv_Col1[0]))*0.5, HTuple(hv_Row1[3]), (HTuple(hv_Col1[3])+HTuple(hv_Col1[2]))*0.5, + &hv_V_ResultRow3, &hv_V_ResultColumn3); + if (0 != ((hv_V_ResultRow3.TupleLength())<5)) + { + continue; + } + DistancePc(ho_LeftContour, hv_V_ResultRow3, hv_V_ResultColumn3, &hv_DistanceMin, + &hv_DistanceMax); + if (0 != ((hv_DistanceMin.TupleMean())<30)) + { + continue; + } + else + { + pts_to_smooth_line(&ho_V_Line3, hv_V_ResultRow3, hv_V_ResultColumn3, 5, &hv_V_Row3, + &hv_V_Column3, &hv_V_Row33, &hv_V_Column33); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross3, hv_V_ResultRow3, hv_V_ResultColumn3, 7, + HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Line3, HDevWindowStack::GetActive()); + } + hv_Symbol1 = 1; + break; + } + if (0 != (hv_Symbol1==0)) + { + return; + } + } + } + //*********************************************************************** + + //*********************************************************************** + //step3.4 ¿ªÊ¼¼ÆËãÓÒ²àµÄ½º´ø¾àÀë. + DistancePl(hv_L_ResultRow2, hv_L_ResultColumn2, hv_L_Row1, hv_L_Col1, hv_L_Row11, + hv_L_Col11, &hv_Distance1); + TupleSort(hv_Distance1, &hv_Sorted1); + TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(0,HTuple((hv_Sorted1.TupleLength())*0.1).TupleInt(),1), + &hv_Selected1); + TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(HTuple((hv_Sorted1.TupleLength())*0.9).TupleInt(),(hv_Sorted1.TupleLength())-1,1), + &hv_Selected2); + DistancePl(hv_L_ResultRow3, hv_L_ResultColumn3, hv_L_Row1, hv_L_Col1, hv_L_Row11, + hv_L_Col11, &hv_Distance2); + //_____________________________________ + //µ÷ÊÔÓÃ, ¹Û²ì²âÁ¿Ð§¹û, + //gen_contour_polygon_xld (Contour1, [L_Row1,L_Row11], [L_Col1,L_Col11]) + //gen_cross_contour_xld (Cross3, L_ResultRow3, L_ResultColumn3, 6, rad(45)) + //dev_display (in_image) + //dev_display (Contour1) + //dev_display (Cross3) + + + TupleSort(hv_Distance2, &hv_Sorted2); + TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(0,HTuple((hv_Sorted2.TupleLength())*0.1).TupleInt(),1), + &hv_Selected3); + TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(HTuple((hv_Sorted2.TupleLength())*0.9).TupleInt(),(hv_Sorted2.TupleLength())-1,1), + &hv_Selected4); + + (*hv_out_disLeftVertical).Clear(); + (*hv_out_disLeftVertical).Append(hv_Selected1.TupleMean()); + (*hv_out_disLeftVertical).Append(hv_Selected2.TupleMean()); + (*hv_out_disLeftVertical).Append(hv_Selected3.TupleMean()); + (*hv_out_disLeftVertical).Append(hv_Selected4.TupleMean()); + (*hv_out_LeftVerticalLinePar).Clear(); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Row2); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Col2); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Row22); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Col22); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Row3); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Column3); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Row33); + (*hv_out_LeftVerticalLinePar).Append(hv_L_Column33); + + DistancePl(hv_V_ResultRow2, hv_V_ResultColumn2, hv_V_Row1, hv_V_Column1, hv_V_Row11, + hv_V_Column11, &hv_Distance3); + TupleSort(hv_Distance3, &hv_Sorted3); + TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(0,HTuple((hv_Sorted3.TupleLength())*0.1).TupleInt(),1), + &hv_Selected5); + TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(HTuple((hv_Sorted3.TupleLength())*0.9).TupleInt(),(hv_Sorted3.TupleLength())-1,1), + &hv_Selected6); + + DistancePl(hv_V_ResultRow3, hv_V_ResultColumn3, hv_V_Row1, hv_V_Column1, hv_V_Row11, + hv_V_Column11, &hv_Distance4); + TupleSort(hv_Distance4, &hv_Sorted4); + TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(0,HTuple((hv_Sorted4.TupleLength())*0.1).TupleInt(),1), + &hv_Selected7); + TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(HTuple((hv_Sorted4.TupleLength())*0.9).TupleInt(),(hv_Sorted4.TupleLength())-1,1), + &hv_Selected8); + + (*hv_out_disLeftLevel).Clear(); + (*hv_out_disLeftLevel).Append(hv_Selected5.TupleMean()); + (*hv_out_disLeftLevel).Append(hv_Selected6.TupleMean()); + (*hv_out_disLeftLevel).Append(hv_Selected7.TupleMean()); + (*hv_out_disLeftLevel).Append(hv_Selected8.TupleMean()); + (*hv_out_LeftLevelLinePar).Clear(); + (*hv_out_LeftLevelLinePar).Append(hv_V_Row2); + (*hv_out_LeftLevelLinePar).Append(hv_V_Col2); + (*hv_out_LeftLevelLinePar).Append(hv_V_Row22); + (*hv_out_LeftLevelLinePar).Append(hv_V_Col22); + (*hv_out_LeftLevelLinePar).Append(hv_V_Row3); + (*hv_out_LeftLevelLinePar).Append(hv_V_Column3); + (*hv_out_LeftLevelLinePar).Append(hv_V_Row33); + (*hv_out_LeftLevelLinePar).Append(hv_V_Column33); + + (*hv_out_standardPar).Clear(); + (*hv_out_standardPar).Append(hv_L_Row1); + (*hv_out_standardPar).Append(hv_L_Col1); + (*hv_out_standardPar).Append(hv_L_Row11); + (*hv_out_standardPar).Append(hv_L_Col11); + (*hv_out_standardPar).Append(hv_V_Row1); + (*hv_out_standardPar).Append(hv_V_Column1); + (*hv_out_standardPar).Append(hv_V_Row11); + (*hv_out_standardPar).Append(hv_V_Column11); + if (0 != (HTuple(((*hv_out_disLeftVertical).TupleLength())==4).TupleAnd(((*hv_out_disLeftLevel).TupleLength())==4))) + { + (*hv_out_Flag) = 0; + } + } + // catch (Exception) + catch (HException &HDevExpDefaultException) + { + HDevExpDefaultException.ToHTuple(&hv_Exception); + //stop () + } + return; +} + +void cal_Right_Distance (HObject ho_in_image, HObject ho_GlueRegions, HObject ho_WhiteRegion, + HObject ho_RightXLD, HTuple hv_in_ProductType, HTuple *hv_out_disRightVertical, + HTuple *hv_out_RightVerticalLinePar, HTuple *hv_out_disRightLevel, HTuple *hv_out_RightLevelLinePar, + HTuple *hv_out_standardPar, HTuple *hv_out_Flag) +{ + + // Local iconic variables + HObject ho_RegionTrans, ho_RegionDilation, ho_ImageReduced; + HObject ho_ImageCleared2, ho_ImageSub2, ho_Cross, ho_RegionOpening; + HObject ho_Regions1, ho_L_Line1, ho_Cross2, ho_Regions2; + HObject ho_Region2, ho_RegionErosion1, ho_RegionIntersection1; + HObject ho_L_Line2, ho_Line, ho_Contour2, ho_V_Regions2; + HObject ho_V_Line2, ho_Cross3, ho_V_Regions1, ho_V_Line1; + HObject ho_Cross1, ho_Cross4, ho_Contour, ho_Region1, ho_ImageReduced2; + HObject ho_EdgeAmplitude1, ho_ImageAbs1, ho_ImageScaled1; + HObject ho_RegionClosing, ho_ConnectedRegions, ho_SelectedRegions1; + HObject ho_SelectedRegions, ho_RegionTrans1, ho_V_Regions3; + HObject ho_V_Line3, ho_Rectangle, ho_Rectangle1, ho_ImageCleared; + HObject ho_ImageSub, ho_ImageReduced1, ho_ImageGauss, ho_EdgeAmplitude; + HObject ho_ImageAbs, ho_ImageScaled, ho_Region, ho_RegionErosion; + HObject ho_RegionIntersection, ho_ObjectSelected, ho_L_Regions3; + HObject ho_L_Line3; + + // Local control variables + HTuple hv_Debug, hv_clip_Row1, hv_clip_Row2; + HTuple hv_move_col, hv_insideRow, hv_insideCol, hv_outsideRow; + HTuple hv_outsideCol, hv_L_ResultRow1, hv_L_ResultColumn1; + HTuple hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11, hv_Height; + HTuple hv_L_ResultRow2, hv_L_ResultColumn2, hv_L_Row2; + HTuple hv_L_Col2, hv_L_Row22, hv_L_Col22, hv_ResultRow2; + HTuple hv_ResultColumn2, hv_Row11, hv_Column11, hv_Row21; + HTuple hv_Column21, hv_k, hv_b, hv_row, hv_col, hv_V_ResultRow2; + HTuple hv_V_ResultColumn2, hv_V_Row2, hv_V_Col2, hv_V_Row22; + HTuple hv_V_Col22, hv_V_ResultRow1, hv_V_ResultColumn1; + HTuple hv_V_Row1, hv_V_Column1, hv_V_Row11, hv_V_Column11; + HTuple hv_Row1, hv_Column1, hv_IsOverlapping, hv_Row2; + HTuple hv_Column2, hv_Row3, hv_Column3, hv_IsOverlapping2; + HTuple hv_Row4, hv_Column4, hv_Value, hv_Value1, hv_Indices; + HTuple hv_Symbol1, hv_index1, hv_N, hv_X, hv_Row, hv_Col; + HTuple hv_V_ResultRow3, hv_V_ResultColumn3, hv_DistanceMin; + HTuple hv_DistanceMax, hv_V_Row3, hv_V_Column3, hv_V_Row33; + HTuple hv_V_Column33, hv_Col11, hv_Mean, hv_Deviation; + HTuple hv_Symbol, hv_L_ResultRow3, hv_L_ResultColumn3; + HTuple hv_Distance, hv_Sorted, hv_start1, hv_end1, hv_Selected; + HTuple hv_Greater, hv_Less, hv_And, hv_Indices1, hv_L_Row3; + HTuple hv_L_Column3, hv_L_Row33, hv_L_Column33, hv_Distance1; + HTuple hv_Sorted1, hv_Selected1, hv_Selected2, hv_Distance2; + HTuple hv_Sorted2, hv_Selected3, hv_Selected4, hv_Distance3; + HTuple hv_Sorted3, hv_Selected5, hv_Selected6, hv_Distance4; + HTuple hv_Sorted4, hv_Selected7, hv_Selected8, hv_Exception; + + + + + (*hv_out_disRightVertical) = HTuple(); + (*hv_out_RightVerticalLinePar) = HTuple(); + (*hv_out_disRightLevel) = HTuple(); + (*hv_out_RightLevelLinePar) = HTuple(); + (*hv_out_standardPar) = HTuple(); + (*hv_out_Flag) = 1; + hv_Debug = 0; + //ÎÊÌâµã: ˮƽϱßԵûÓа취׼ȷ¶¨Î». + if (0 != (hv_in_ProductType==HTuple("181-1"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 1050; + hv_move_col = 30; + } + else if (0 != (hv_in_ProductType==HTuple("181-2"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 1050; + hv_move_col = 30; + } + else if (0 != (hv_in_ProductType==HTuple("185-1"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 950; + hv_move_col = 30; + } + else if (0 != (hv_in_ProductType==HTuple("185-2"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 900; + hv_move_col = 15; + } + else if (0 != (hv_in_ProductType==HTuple("186-1"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = -150; + hv_move_col = 30; + } + else if (0 != (hv_in_ProductType==HTuple("186-2"))) + { + hv_clip_Row1 = -150; + hv_clip_Row2 = 550; + hv_move_col = 100; + } + try + { + //Ô¤´¦Àí,ÔöÇ¿ÓÒ²à²øÈÆµçоµÄ»Ò½×²î. + ShapeTrans(ho_GlueRegions, &ho_RegionTrans, "rectangle2"); + DilationRectangle1(ho_RegionTrans, &ho_RegionDilation, 700, 700); + if (0 != hv_Debug) + { + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_RegionDilation, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + ReduceDomain(ho_in_image, ho_RegionDilation, &ho_ImageReduced); + GenImageProto(ho_ImageReduced, &ho_ImageCleared2, 40); + SubImage(ho_ImageReduced, ho_ImageCleared2, &ho_ImageSub2, 5, 0); + //dev_display (ImageSub2) + //************************************************** + //step3.2 Ëã·¨»ñÈ¡×ó²àµÄ¶¨Î»µã, + //»ñÈ¡ÄÚ²à°üĤµÄËĸöµãλ + Get_Rectangle2_Corner_new(ho_WhiteRegion, &hv_insideRow, &hv_insideCol); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross, hv_insideRow, hv_insideCol, 35, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_WhiteRegion, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //GlueRegionsÐèÒª½øÐÐÔ¤´¦Àí, È¥³ý±ßÔµ¸ÉÈŵã, + OpeningCircle(ho_GlueRegions, &ho_RegionOpening, 30); + //»ñÈ¡Íâ²à°üĤµÄËĸöµãλ, + Get_Rectangle2_Corner_new(ho_RegionOpening, &hv_outsideRow, &hv_outsideCol); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross, hv_outsideRow, hv_outsideCol, 35, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_RegionOpening, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //*********************************************************************** + //step3.3 ץȡÓÒ²à°üĤµÄÂÖÀªµã, + //step3.3.1 ץȡˮƽÂÖÀªÒ», + rake(ho_ImageSub2, &ho_Regions1, 150, 300, 3, 1, 15, "positive", "first", HTuple(hv_outsideRow[1]), + HTuple(hv_outsideCol[1]), HTuple(hv_outsideRow[0]), HTuple(hv_outsideCol[0]), + &hv_L_ResultRow1, &hv_L_ResultColumn1); + if (0 != ((hv_L_ResultRow1.TupleLength())<10)) + { + return; + } + pts_to_smooth_line(&ho_L_Line1, hv_L_ResultRow1, hv_L_ResultColumn1, 5, &hv_L_Row1, + &hv_L_Col1, &hv_L_Row11, &hv_L_Col11); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_L_ResultRow1, hv_L_ResultColumn1, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_ImageSub2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Regions1, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line1, HDevWindowStack::GetActive()); + } + //step3.3.2 ץȡˮƽÂÖÀª¶þ, + //ץȡˮƽÏß2, + if (0 != (HTuple(hv_in_ProductType==HTuple("181-1")).TupleOr(hv_in_ProductType==HTuple("181-2")))) + { + hv_Height = 550; + } + else + { + hv_Height = 300; + } + rake(ho_in_image, &ho_Regions2, 240, hv_Height, 5, 1, 15, "negative", "first", + HTuple(hv_insideRow[0]), HTuple(hv_insideCol[0]), HTuple(hv_insideRow[1]), + HTuple(hv_insideCol[1]), &hv_L_ResultRow2, &hv_L_ResultColumn2); + if (0 != ((hv_L_ResultRow2.TupleLength())<10)) + { + return; + } + + + GenRegionPoints(&ho_Region2, hv_L_ResultRow2, hv_L_ResultColumn2); + ErosionRectangle1(ho_RegionOpening, &ho_RegionErosion1, 2, 125); + //dev_display (Region2) + //dev_display (RegionErosion1) + Intersection(ho_RegionErosion1, ho_Region2, &ho_RegionIntersection1); + GetRegionPoints(ho_RegionIntersection1, &hv_L_ResultRow2, &hv_L_ResultColumn2); + + pts_to_best_line(&ho_L_Line2, hv_L_ResultRow2, hv_L_ResultColumn2, 5, &hv_L_Row2, + &hv_L_Col2, &hv_L_Row22, &hv_L_Col22); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_L_ResultRow2, hv_L_ResultColumn2, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Regions2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line2, HDevWindowStack::GetActive()); + } + + //step3.3.2 ץȡÊúÖ±°üĤµÄ±ßÔµ¶þ + //ץȡÊúÖ±°üĤµÄ²¿·Ö±ßÔµ,ÓÃÓÚÉú³É¸¨ÖúÏß, + rake(ho_in_image, &ho_Regions2, 100, 450, 5, 1, 12, "negative", "first", HTuple(hv_insideRow[1]), + HTuple(hv_insideCol[1]), HTuple(hv_insideRow[3]), HTuple(hv_insideCol[3]), + &hv_ResultRow2, &hv_ResultColumn2); + if (0 != ((hv_ResultRow2.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_Line, hv_ResultRow2, hv_ResultColumn2, 5, &hv_Row11, &hv_Column11, + &hv_Row21, &hv_Column21); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_ResultRow2, hv_ResultColumn2, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Regions2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Line, HDevWindowStack::GetActive()); + } + hv_k = (hv_Row11-hv_Row21)/(hv_Column11-hv_Column21); + hv_b = hv_Row11-(hv_k*hv_Column11); + hv_row = hv_Row11+1500; + hv_col = (hv_row-hv_b)/hv_k; + if (0 != hv_Debug) + { + GenContourPolygonXld(&ho_Contour2, hv_Row11.TupleConcat(hv_row), hv_Column11.TupleConcat(hv_col)); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Contour2, HDevWindowStack::GetActive()); + } + rake(ho_in_image, &ho_V_Regions2, 100, 60, 5, 1, 10, "negative", "first", hv_Row11, + hv_Column11, hv_row, hv_col, &hv_V_ResultRow2, &hv_V_ResultColumn2); + if (0 != ((hv_V_ResultRow2.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_V_Line2, hv_V_ResultRow2, hv_V_ResultColumn2, 2, &hv_V_Row2, + &hv_V_Col2, &hv_V_Row22, &hv_V_Col22); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross3, hv_V_ResultRow2, hv_V_ResultColumn2, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Line2, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //step3.3.3 ץȡÊúÖ±°üĤµÄ±ßÔµÒ» + rake(ho_ImageSub2, &ho_V_Regions1, 200, 250, 5, 1, 10, "positive", "first", hv_V_Row22, + HTuple(hv_outsideCol[1])-15, HTuple(hv_outsideRow[1]), HTuple(hv_outsideCol[1])-15, + &hv_V_ResultRow1, &hv_V_ResultColumn1); + if (0 != ((hv_V_ResultRow1.TupleLength())<10)) + { + return; + } + pts_to_best_line(&ho_V_Line1, hv_V_ResultRow1, hv_V_ResultColumn1, 5, &hv_V_Row1, + &hv_V_Column1, &hv_V_Row11, &hv_V_Column11); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_V_ResultRow1, hv_V_ResultColumn1, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_ImageSub2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions1, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Line1, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + //************************************************************ + //step3.3.4 ץȡÊúÖ±°üĤµÄ±ßÔµÈý + //»ñȡˮƽĤÓë×ó²àÊúÖ±±ßµÄ½»µã; + IntersectionLineContourXld(ho_RightXLD, hv_L_Row1, hv_L_Col1, hv_L_Row11, hv_L_Col11, + &hv_Row1, &hv_Column1, &hv_IsOverlapping); + IntersectionLineContourXld(ho_RightXLD, hv_L_Row2, hv_L_Col2, hv_L_Row22, hv_L_Col22, + &hv_Row2, &hv_Column2, &hv_IsOverlapping); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross1, hv_Row1, hv_Column1, 24, 0.785398); + GenCrossContourXld(&ho_Cross2, hv_Row2, hv_Column2, 24, 0.785398); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_RightXLD, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross1, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + } + + IntersectionLines(hv_Row1, hv_Column1+800, hv_Row2, hv_Column1+800, hv_L_Row1, + hv_L_Col1, hv_L_Row11, hv_L_Col11, &hv_Row3, &hv_Column3, &hv_IsOverlapping2); + IntersectionLines(hv_Row1, hv_Column1+800, hv_Row2, hv_Column2+800, hv_L_Row2, + hv_L_Col2, hv_L_Row22, hv_L_Col22, &hv_Row4, &hv_Column4, &hv_IsOverlapping2); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross3, hv_Row3, hv_Column3, 35, HTuple(45).TupleRad()); + GenCrossContourXld(&ho_Cross4, hv_Row4, hv_Column4, 35, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross4, HDevWindowStack::GetActive()); + } + + //¸üÐÂ, ¸Ã´¦Çø·Ö²»Í¬µÄ²úÏß + if (0 != (HTuple(hv_in_ProductType==HTuple("181-1")).TupleOr(hv_in_ProductType==HTuple("181-2")))) + { + GenContourPolygonXld(&ho_Contour, (((hv_Row1.TupleConcat(hv_Row2)).TupleConcat(hv_Row4)).TupleConcat(hv_Row3)).TupleConcat(hv_Row1), + ((((hv_Column1+hv_move_col).TupleConcat(hv_Column2+hv_move_col)).TupleConcat(hv_Column4-100)).TupleConcat(hv_Column3-100)).TupleConcat(hv_Column1+hv_move_col)); + } + else + { + GenContourPolygonXld(&ho_Contour, (((hv_Row1.TupleConcat(hv_Row2)).TupleConcat(hv_Row4)).TupleConcat(hv_Row3)).TupleConcat(hv_Row1), + ((((hv_Column1+hv_move_col).TupleConcat(hv_Column2+hv_move_col)).TupleConcat(hv_Column4-300)).TupleConcat(hv_Column3-300)).TupleConcat(hv_Column1+hv_move_col)); + } + //dev_display (in_image) + //dev_display (Contour) + GenRegionContourXld(ho_Contour, &ho_Region1, "filled"); + ReduceDomain(ho_in_image, ho_Region1, &ho_ImageReduced2); + SobelAmp(ho_ImageReduced2, &ho_EdgeAmplitude1, "x", 3); + AbsImage(ho_EdgeAmplitude1, &ho_ImageAbs1); + ScaleImage(ho_ImageAbs1, &ho_ImageScaled1, 15, -120); + Threshold(ho_ImageScaled1, &ho_Region1, 60, 255); + ClosingRectangle1(ho_Region1, &ho_RegionClosing, 4, 60); + Connection(ho_RegionClosing, &ho_ConnectedRegions); + RegionFeatures(ho_ConnectedRegions, "height", &hv_Value); + SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "height", "and", 40, 99999); + RegionFeatures(ho_SelectedRegions1, "height", &hv_Value1); + TupleSortIndex(hv_Value1, &hv_Indices); + hv_Symbol1 = 0; + { + HTuple end_val227 = hv_Indices.TupleLength(); + HTuple step_val227 = 1; + for (hv_index1=1; hv_index1.Continue(end_val227, step_val227); hv_index1 += step_val227) + { + hv_N = hv_Value1.TupleLength(); + hv_X = HTuple(hv_Indices[hv_N-hv_index1]); + SelectObj(ho_SelectedRegions1, &ho_SelectedRegions, hv_X+1); + ShapeTrans(ho_SelectedRegions, &ho_RegionTrans1, "rectangle1"); + Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); + + rake(ho_in_image, &ho_V_Regions3, 100, 200, 2, 1, 15, "positive", "first", + HTuple(hv_Row[2]), HTuple(hv_Col[2]), HTuple(hv_Row[0]), HTuple(hv_Col[0]), + &hv_V_ResultRow3, &hv_V_ResultColumn3); + if (0 != ((hv_V_ResultRow3.TupleLength())<10)) + { + continue; + } + DistancePc(ho_RightXLD, hv_V_ResultRow3, hv_V_ResultColumn3, &hv_DistanceMin, + &hv_DistanceMax); + //a := mean(DistanceMin) + if (0 != ((hv_DistanceMin.TupleMean())<20)) + { + continue; + } + else + { + pts_to_smooth_line(&ho_V_Line3, hv_V_ResultRow3, hv_V_ResultColumn3, 10, + &hv_V_Row3, &hv_V_Column3, &hv_V_Row33, &hv_V_Column33); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross2, hv_V_ResultRow3, hv_V_ResultColumn3, 7, + HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Regions3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross2, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_V_Line3, HDevWindowStack::GetActive()); + } + hv_Symbol1 = 1; + break; + } + } + } + if (0 != (hv_Symbol1==0)) + { + return; + } + + //________________________________________________________________ + //step3.3.4 ץȡˮƽ°üĤµÄ±ßÔµÈý + GenRectangle1(&ho_Rectangle, HTuple(hv_insideRow[3])+hv_clip_Row1, HTuple(hv_insideCol[3])-50, + HTuple(hv_insideRow[3])+hv_clip_Row2, HTuple(hv_outsideCol[3])); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Rectangle, HDevWindowStack::GetActive()); + + Get_Rectangle2_Corner_new(ho_Rectangle, &hv_Row11, &hv_Col11); + GenRectangle1(&ho_Rectangle1, HTuple(hv_Row11[2])-100, HTuple(hv_Col11[2])+100, + HTuple(hv_Row11[2]), HTuple(hv_Col11[2])+200); + //dev_display (in_image) + //dev_display (Rectangle1) + Intensity(ho_Rectangle1, ho_in_image, &hv_Mean, &hv_Deviation); + GenImageProto(ho_in_image, &ho_ImageCleared, (hv_Mean.TupleInt())*0.5); + SubImage(ho_in_image, ho_ImageCleared, &ho_ImageSub, 6, 0); + ReduceDomain(ho_ImageSub, ho_Rectangle, &ho_ImageReduced1); + GaussFilter(ho_ImageReduced1, &ho_ImageGauss, 9); + SobelAmp(ho_ImageGauss, &ho_EdgeAmplitude, "y", 3); + AbsImage(ho_EdgeAmplitude, &ho_ImageAbs); + ScaleImage(ho_ImageAbs, &ho_ImageScaled, 17, -120); + Threshold(ho_ImageScaled, &ho_Region, 50, 255); + ErosionRectangle1(ho_Rectangle, &ho_RegionErosion, 1, 20); + Intersection(ho_Region, ho_RegionErosion, &ho_RegionIntersection); + ClosingRectangle1(ho_RegionIntersection, &ho_RegionClosing, 100, 6); + Connection(ho_RegionClosing, &ho_ConnectedRegions); + //dev_display (in_image) + //dev_display (Rectangle) + //stop () + RegionFeatures(ho_ConnectedRegions, "width", &hv_Value); + SelectShape(ho_ConnectedRegions, &ho_SelectedRegions1, "width", "and", 25, 99999); + RegionFeatures(ho_SelectedRegions1, "row", &hv_Value1); + TupleSortIndex(hv_Value1, &hv_Indices); + hv_Symbol = 0; + { + HTuple end_val293 = hv_Indices.TupleLength(); + HTuple step_val293 = 1; + for (hv_index1=1; hv_index1.Continue(end_val293, step_val293); hv_index1 += step_val293) + { + hv_N = hv_Value1.TupleLength(); + hv_X = HTuple(hv_Indices[hv_N-hv_index1]); + SelectObj(ho_SelectedRegions1, &ho_ObjectSelected, hv_X+1); + ShapeTrans(ho_ObjectSelected, &ho_RegionTrans1, "rectangle1"); + Get_Rectangle2_Corner_new(ho_RegionTrans1, &hv_Row, &hv_Col); + rake(ho_in_image, &ho_L_Regions3, 80, 400, 3, 1, 6, "negative", "first", HTuple(hv_Row[2]), + HTuple(hv_Col[2])-40, HTuple(hv_Row[3]), HTuple(hv_Col[3])+80, &hv_L_ResultRow3, + &hv_L_ResultColumn3); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); + if (0 != ((hv_L_ResultRow3.TupleLength())<12)) + { + continue; + } + + if (0 != ((hv_L_ResultRow3.TupleLength())>40)) + { + DistancePl(hv_L_ResultRow3, hv_L_ResultColumn3, HTuple(hv_Row[2]), HTuple(hv_Col[2])-40, + HTuple(hv_Row[3]), HTuple(hv_Col[3])+80, &hv_Distance); + TupleSort(hv_Distance, &hv_Sorted); + hv_start1 = HTuple((hv_Sorted.TupleLength())*0.2).TupleInt(); + hv_end1 = HTuple((hv_Sorted.TupleLength())*0.8).TupleInt(); + TupleSelect(hv_Sorted, HTuple::TupleGenSequence(hv_start1,hv_end1,1), &hv_Selected); + TupleGreaterElem(hv_Distance, hv_Selected.TupleMin(), &hv_Greater); + TupleLessElem(hv_Distance, hv_Selected.TupleMax(), &hv_Less); + TupleAnd(hv_Greater, hv_Less, &hv_And); + TupleFind(hv_And, 1, &hv_Indices1); + TupleSelect(hv_L_ResultRow3, hv_Indices1, &hv_L_ResultRow3); + TupleSelect(hv_L_ResultColumn3, hv_Indices1, &hv_L_ResultColumn3); + } + + pts_to_smooth_line(&ho_L_Line3, hv_L_ResultRow3, hv_L_ResultColumn3, 5, &hv_L_Row3, + &hv_L_Column3, &hv_L_Row33, &hv_L_Column33); + if (0 != hv_Debug) + { + GenCrossContourXld(&ho_Cross3, hv_L_ResultRow3, hv_L_ResultColumn3, 7, HTuple(45).TupleRad()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"red"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Regions3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"green"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_Cross3, HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + SetColor(HDevWindowStack::GetActive(),"yellow"); + if (HDevWindowStack::IsOpen()) + DispObj(ho_L_Line3, HDevWindowStack::GetActive()); + // stop(...); only in hdevelop + } + hv_Symbol = 1; + break; + } + } + + if (0 != (hv_Symbol==0)) + { + return; + } + //*********************************************************************** + + //*********************************************************************** + //step3.4 ¿ªÊ¼¼ÆËãÓÒ²àµÄ½º´ø¾àÀë. + DistancePl(hv_L_ResultRow2, hv_L_ResultColumn2, hv_L_Row1, hv_L_Col1, hv_L_Row11, + hv_L_Col11, &hv_Distance1); + TupleSort(hv_Distance1, &hv_Sorted1); + TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(0,HTuple((hv_Sorted1.TupleLength())*0.1).TupleInt(),1), + &hv_Selected1); + TupleSelect(hv_Sorted1, HTuple::TupleGenSequence(HTuple((hv_Sorted1.TupleLength())*0.9).TupleInt(),(hv_Sorted1.TupleLength())-1,1), + &hv_Selected2); + + DistancePl(hv_L_ResultRow3, hv_L_ResultColumn3, hv_L_Row1, hv_L_Col1, hv_L_Row11, + hv_L_Col11, &hv_Distance2); + TupleSort(hv_Distance2, &hv_Sorted2); + TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(0,HTuple((hv_Sorted2.TupleLength())*0.1).TupleInt(),1), + &hv_Selected3); + TupleSelect(hv_Sorted2, HTuple::TupleGenSequence(HTuple((hv_Sorted2.TupleLength())*0.9).TupleInt(),(hv_Sorted2.TupleLength())-1,1), + &hv_Selected4); + + (*hv_out_disRightVertical).Clear(); + (*hv_out_disRightVertical).Append(hv_Selected1.TupleMean()); + (*hv_out_disRightVertical).Append(hv_Selected2.TupleMean()); + (*hv_out_disRightVertical).Append(hv_Selected3.TupleMean()); + (*hv_out_disRightVertical).Append(hv_Selected4.TupleMean()); + (*hv_out_RightVerticalLinePar).Clear(); + (*hv_out_RightVerticalLinePar).Append(hv_L_Row2); + (*hv_out_RightVerticalLinePar).Append(hv_L_Col2); + (*hv_out_RightVerticalLinePar).Append(hv_L_Row22); + (*hv_out_RightVerticalLinePar).Append(hv_L_Col22); + (*hv_out_RightVerticalLinePar).Append(hv_L_Row3); + (*hv_out_RightVerticalLinePar).Append(hv_L_Column3); + (*hv_out_RightVerticalLinePar).Append(hv_L_Row33); + (*hv_out_RightVerticalLinePar).Append(hv_L_Column33); + + DistancePl(hv_V_ResultRow2, hv_V_ResultColumn2, hv_V_Row1, hv_V_Column1, hv_V_Row11, + hv_V_Column11, &hv_Distance3); + TupleSort(hv_Distance3, &hv_Sorted3); + TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(0,HTuple((hv_Sorted3.TupleLength())*0.1).TupleInt(),1), + &hv_Selected5); + TupleSelect(hv_Sorted3, HTuple::TupleGenSequence(HTuple((hv_Sorted3.TupleLength())*0.9).TupleInt(),(hv_Sorted3.TupleLength())-1,1), + &hv_Selected6); + + DistancePl(hv_V_ResultRow3, hv_V_ResultColumn3, hv_V_Row1, hv_V_Column1, hv_V_Row11, + hv_V_Column11, &hv_Distance4); + TupleSort(hv_Distance4, &hv_Sorted4); + TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(0,HTuple((hv_Sorted4.TupleLength())*0.1).TupleInt(),1), + &hv_Selected7); + TupleSelect(hv_Sorted4, HTuple::TupleGenSequence(HTuple((hv_Sorted4.TupleLength())*0.9).TupleInt(),(hv_Sorted4.TupleLength())-1,1), + &hv_Selected8); + + (*hv_out_disRightLevel).Clear(); + (*hv_out_disRightLevel).Append(hv_Selected5.TupleMean()); + (*hv_out_disRightLevel).Append(hv_Selected6.TupleMean()); + (*hv_out_disRightLevel).Append(hv_Selected7.TupleMean()); + (*hv_out_disRightLevel).Append(hv_Selected8.TupleMean()); + (*hv_out_RightLevelLinePar).Clear(); + (*hv_out_RightLevelLinePar).Append(hv_V_Row2); + (*hv_out_RightLevelLinePar).Append(hv_V_Col2); + (*hv_out_RightLevelLinePar).Append(hv_V_Row22); + (*hv_out_RightLevelLinePar).Append(hv_V_Col22); + (*hv_out_RightLevelLinePar).Append(hv_V_Row3); + (*hv_out_RightLevelLinePar).Append(hv_V_Column3); + (*hv_out_RightLevelLinePar).Append(hv_V_Row33); + (*hv_out_RightLevelLinePar).Append(hv_V_Column33); + (*hv_out_standardPar).Clear(); + (*hv_out_standardPar).Append(hv_V_Row1); + (*hv_out_standardPar).Append(hv_V_Column1); + (*hv_out_standardPar).Append(hv_V_Row11); + (*hv_out_standardPar).Append(hv_V_Column11); + (*hv_out_standardPar).Append(hv_L_Row1); + (*hv_out_standardPar).Append(hv_L_Col1); + (*hv_out_standardPar).Append(hv_L_Row11); + (*hv_out_standardPar).Append(hv_L_Col11); + if (0 != (HTuple(((*hv_out_disRightLevel).TupleLength())==4).TupleAnd(((*hv_out_disRightLevel).TupleLength())==4))) + { + (*hv_out_Flag) = 0; + } + } + // catch (Exception) + catch (HException &HDevExpDefaultException) + { + HDevExpDefaultException.ToHTuple(&hv_Exception); + //stop () + } + return; +} + +// Chapter: Graphics / Text +// Short Description: This procedure writes a text message. +void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem, + HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box) +{ + + // Local iconic variables + + // Local control variables + HTuple hv_GenParamName, hv_GenParamValue; + + //This procedure displays text in a graphics window. + // + //Input parameters: + //WindowHandle: The WindowHandle of the graphics window, where + // the message should be displayed + //String: A tuple of strings containing the text message to be displayed + //CoordSystem: If set to 'window', the text position is given + // with respect to the window coordinate system. + // If set to 'image', image coordinates are used. + // (This may be useful in zoomed images.) + //Row: The row coordinate of the desired text position + // A tuple of values is allowed to display text at different + // positions. + //Column: The column coordinate of the desired text position + // A tuple of values is allowed to display text at different + // positions. + //Color: defines the color of the text as string. + // If set to [], '' or 'auto' the currently set color is used. + // If a tuple of strings is passed, the colors are used cyclically... + // - if |Row| == |Column| == 1: for each new textline + // = else for each text position. + //Box: If Box[0] is set to 'true', the text is written within an orange box. + // If set to' false', no box is displayed. + // If set to a color string (e.g. 'white', '#FF00CC', etc.), + // the text is written in a box of that color. + // An optional second value for Box (Box[1]) controls if a shadow is displayed: + // 'true' -> display a shadow in a default color + // 'false' -> display no shadow + // otherwise -> use given string as color string for the shadow color + // + //It is possible to display multiple text strings in a single call. + //In this case, some restrictions apply: + //- Multiple text positions can be defined by specifying a tuple + // with multiple Row and/or Column coordinates, i.e.: + // - |Row| == n, |Column| == n + // - |Row| == n, |Column| == 1 + // - |Row| == 1, |Column| == n + //- If |Row| == |Column| == 1, + // each element of String is display in a new textline. + //- If multiple positions or specified, the number of Strings + // must match the number of positions, i.e.: + // - Either |String| == n (each string is displayed at the + // corresponding position), + // - or |String| == 1 (The string is displayed n times). + // + // + //Convert the parameters for disp_text. + if (0 != (HTuple(hv_Row==HTuple()).TupleOr(hv_Column==HTuple()))) + { + return; + } + if (0 != (hv_Row==-1)) + { + hv_Row = 12; + } + if (0 != (hv_Column==-1)) + { + hv_Column = 12; + } + // + //Convert the parameter Box to generic parameters. + hv_GenParamName = HTuple(); + hv_GenParamValue = HTuple(); + if (0 != ((hv_Box.TupleLength())>0)) + { + if (0 != (HTuple(hv_Box[0])==HTuple("false"))) + { + //Display no box + hv_GenParamName = hv_GenParamName.TupleConcat("box"); + hv_GenParamValue = hv_GenParamValue.TupleConcat("false"); + } + else if (0 != (HTuple(hv_Box[0])!=HTuple("true"))) + { + //Set a color other than the default. + hv_GenParamName = hv_GenParamName.TupleConcat("box_color"); + hv_GenParamValue = hv_GenParamValue.TupleConcat(HTuple(hv_Box[0])); + } + } + if (0 != ((hv_Box.TupleLength())>1)) + { + if (0 != (HTuple(hv_Box[1])==HTuple("false"))) + { + //Display no shadow. + hv_GenParamName = hv_GenParamName.TupleConcat("shadow"); + hv_GenParamValue = hv_GenParamValue.TupleConcat("false"); + } + else if (0 != (HTuple(hv_Box[1])!=HTuple("true"))) + { + //Set a shadow color other than the default. + hv_GenParamName = hv_GenParamName.TupleConcat("shadow_color"); + hv_GenParamValue = hv_GenParamValue.TupleConcat(HTuple(hv_Box[1])); + } + } + //Restore default CoordSystem behavior. + if (0 != (hv_CoordSystem!=HTuple("window"))) + { + hv_CoordSystem = "image"; + } + // + if (0 != (hv_Color==HTuple(""))) + { + //disp_text does not accept an empty string for Color. + hv_Color = HTuple(); + } + // + DispText(hv_WindowHandle, hv_String, hv_CoordSystem, hv_Row, hv_Column, hv_Color, + hv_GenParamName, hv_GenParamValue); + return; +} + +// Chapter: XLD / Creation +// Short Description: Creates an arrow shaped XLD contour. +void gen_arrow_contour_xld (HObject *ho_Arrow, HTuple hv_Row1, HTuple hv_Column1, + HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth) +{ + + // Local iconic variables + HObject ho_TempArrow; + + // Local control variables + HTuple hv_Length, hv_ZeroLengthIndices, hv_DR; + HTuple hv_DC, hv_HalfHeadWidth, hv_RowP1, hv_ColP1, hv_RowP2; + HTuple hv_ColP2, hv_Index; + + //This procedure generates arrow shaped XLD contours, + //pointing from (Row1, Column1) to (Row2, Column2). + //If starting and end point are identical, a contour consisting + //of a single point is returned. + // + //input parameteres: + //Row1, Column1: Coordinates of the arrows' starting points + //Row2, Column2: Coordinates of the arrows' end points + //HeadLength, HeadWidth: Size of the arrow heads in pixels + // + //output parameter: + //Arrow: The resulting XLD contour + // + //The input tuples Row1, Column1, Row2, and Column2 have to be of + //the same length. + //HeadLength and HeadWidth either have to be of the same length as + //Row1, Column1, Row2, and Column2 or have to be a single element. + //If one of the above restrictions is violated, an error will occur. + // + // + //Init + GenEmptyObj(&(*ho_Arrow)); + // + //Calculate the arrow length + DistancePp(hv_Row1, hv_Column1, hv_Row2, hv_Column2, &hv_Length); + // + //Mark arrows with identical start and end point + //(set Length to -1 to avoid division-by-zero exception) + hv_ZeroLengthIndices = hv_Length.TupleFind(0); + if (0 != (hv_ZeroLengthIndices!=-1)) + { + hv_Length[hv_ZeroLengthIndices] = -1; + } + // + //Calculate auxiliary variables. + hv_DR = (1.0*(hv_Row2-hv_Row1))/hv_Length; + hv_DC = (1.0*(hv_Column2-hv_Column1))/hv_Length; + hv_HalfHeadWidth = hv_HeadWidth/2.0; + // + //Calculate end points of the arrow head. + hv_RowP1 = (hv_Row1+((hv_Length-hv_HeadLength)*hv_DR))+(hv_HalfHeadWidth*hv_DC); + hv_ColP1 = (hv_Column1+((hv_Length-hv_HeadLength)*hv_DC))-(hv_HalfHeadWidth*hv_DR); + hv_RowP2 = (hv_Row1+((hv_Length-hv_HeadLength)*hv_DR))-(hv_HalfHeadWidth*hv_DC); + hv_ColP2 = (hv_Column1+((hv_Length-hv_HeadLength)*hv_DC))+(hv_HalfHeadWidth*hv_DR); + // + //Finally create output XLD contour for each input point pair + { + HTuple end_val45 = (hv_Length.TupleLength())-1; + HTuple step_val45 = 1; + for (hv_Index=0; hv_Index.Continue(end_val45, step_val45); hv_Index += step_val45) + { + if (0 != (HTuple(hv_Length[hv_Index])==-1)) + { + //Create_ single points for arrows with identical start and end point + GenContourPolygonXld(&ho_TempArrow, HTuple(hv_Row1[hv_Index]), HTuple(hv_Column1[hv_Index])); + } + else + { + //Create arrow contour + GenContourPolygonXld(&ho_TempArrow, ((((HTuple(hv_Row1[hv_Index]).TupleConcat(HTuple(hv_Row2[hv_Index]))).TupleConcat(HTuple(hv_RowP1[hv_Index]))).TupleConcat(HTuple(hv_Row2[hv_Index]))).TupleConcat(HTuple(hv_RowP2[hv_Index]))).TupleConcat(HTuple(hv_Row2[hv_Index])), + ((((HTuple(hv_Column1[hv_Index]).TupleConcat(HTuple(hv_Column2[hv_Index]))).TupleConcat(HTuple(hv_ColP1[hv_Index]))).TupleConcat(HTuple(hv_Column2[hv_Index]))).TupleConcat(HTuple(hv_ColP2[hv_Index]))).TupleConcat(HTuple(hv_Column2[hv_Index]))); + } + ConcatObj((*ho_Arrow), ho_TempArrow, &(*ho_Arrow)); + } + } + return; +} + +void Get_Rectangle2_Corner_new (HObject ho_Rectangle, HTuple *hv_out_Row, HTuple *hv_out_Col) +{ + + // Local iconic variables + HObject ho_Rectangle1, ho_Rectangle_XLD1; + + // Local control variables + HTuple hv_Row1, hv_Column1, hv_Phi1, hv_Length11; + HTuple hv_Length21, hv_Col1, hv_corner_row, hv_corner_col; + HTuple hv_rowSortIndex, hv_Exception; + + //********************************************************************** + //Function Name: Get_Rectangle2_Corner + //Author: ºúºº±ø + //Description: »ñÈ¡¾ØÐÎÇøÓòµÄ¶¥µã×ø±ê,(4¸öµã) + //Input: + // Rectangle, ¾ØÐεÄRegion, + //output£º + // row---¶¥µãrow×ø±ê£¬Ë³ÐòΪ£º×óÉÏ/ÓÒÉÏ/×óÏÂ/ÓÒÏ + // col---¶¥µãcol×ø±ê£¬Ë³ÐòΪ£º×óÉÏ/ÓÒÉÏ/×óÏÂ/ÓÒÏ + //verion change log: ºúºº±ø 2023-08-23 V1.1 Create new function + //******************************************************************************** + try + { + SmallestRectangle2(ho_Rectangle, &hv_Row1, &hv_Column1, &hv_Phi1, &hv_Length11, + &hv_Length21); + GenRectangle2(&ho_Rectangle1, hv_Row1, hv_Column1, hv_Phi1, hv_Length11, hv_Length21); + GenRectangle2ContourXld(&ho_Rectangle_XLD1, hv_Row1, hv_Column1, hv_Phi1, hv_Length11, + hv_Length21); + GetContourXld(ho_Rectangle_XLD1, &hv_Row1, &hv_Col1); + hv_corner_row.Clear(); + hv_corner_row.Append(HTuple(hv_Row1[0])); + hv_corner_row.Append(HTuple(hv_Row1[1])); + hv_corner_row.Append(HTuple(hv_Row1[2])); + hv_corner_row.Append(HTuple(hv_Row1[3])); + hv_corner_col.Clear(); + hv_corner_col.Append(HTuple(hv_Col1[0])); + hv_corner_col.Append(HTuple(hv_Col1[1])); + hv_corner_col.Append(HTuple(hv_Col1[2])); + hv_corner_col.Append(HTuple(hv_Col1[3])); + (*hv_out_Row) = HTuple(); + (*hv_out_Col) = HTuple(); + TupleSortIndex(hv_corner_row, &hv_rowSortIndex); + if (0 != (HTuple(hv_corner_col[HTuple(hv_rowSortIndex[0])])1)) + { + TupleStrFirstN(HTuple(hv_Directories[hv_Index]), 1, &hv_Substring); + if (0 != (HTuple(hv_Substring==HTuple("//")).TupleOr(hv_Substring==HTuple("\\\\")))) + { + hv_NetworkDrive[hv_Index] = 1; + } + } + } + } + } + hv_ImageFilesTmp = HTuple(); + { + HTuple end_val56 = (hv_Directories.TupleLength())-1; + HTuple step_val56 = 1; + for (hv_Index=0; hv_Index.Continue(end_val56, step_val56); hv_Index += step_val56) + { + FileExists(HTuple(hv_Directories[hv_Index]), &hv_FileExists); + if (0 != hv_FileExists) + { + ListFiles(HTuple(hv_Directories[hv_Index]), HTuple("files").TupleConcat(hv_Options), + &hv_AllFiles); + hv_ImageFilesTmp = HTuple(); + { + HTuple end_val61 = (hv_Extensions.TupleLength())-1; + HTuple step_val61 = 1; + for (hv_i=0; hv_i.Continue(end_val61, step_val61); hv_i += step_val61) + { + TupleRegexpSelect(hv_AllFiles, ((".*"+HTuple(hv_Extensions[hv_i]))+"$").TupleConcat("ignore_case"), + &hv_Selection); + hv_ImageFilesTmp = hv_ImageFilesTmp.TupleConcat(hv_Selection); + } + } + TupleRegexpReplace(hv_ImageFilesTmp, (HTuple("\\\\").Append("replace_all")), + "/", &hv_ImageFilesTmp); + if (0 != (HTuple(hv_NetworkDrive[hv_Index]))) + { + TupleRegexpReplace(hv_ImageFilesTmp, (HTuple("//").Append("replace_all")), + "/", &hv_ImageFilesTmp); + hv_ImageFilesTmp = "/"+hv_ImageFilesTmp; + } + else + { + TupleRegexpReplace(hv_ImageFilesTmp, (HTuple("//").Append("replace_all")), + "/", &hv_ImageFilesTmp); + } + break; + } + } + } + //Concatenate the output image paths. + (*hv_ImageFiles) = (*hv_ImageFiles).TupleConcat(hv_ImageFilesTmp); + } + } + return; +} + +// Chapter: File / Misc +// Short Description: Parse a filename into directory, base filename, and extension +void parse_filename (HTuple hv_FileName, HTuple *hv_BaseName, HTuple *hv_Extension, + HTuple *hv_Directory) +{ + + // Local control variables + HTuple hv_DirectoryTmp, hv_Substring; + + //This procedure gets a filename (with full path) as input + //and returns the directory path, the base filename and the extension + //in three different strings. + // + //In the output path the path separators will be replaced + //by '/' in all cases. + // + //The procedure shows the possibilities of regular expressions in HALCON. + // + //Input parameters: + //FileName: The input filename + // + //Output parameters: + //BaseName: The filename without directory description and file extension + //Extension: The file extension + //Directory: The directory path + // + //Example: + //basename('C:/images/part_01.png',...) returns + //BaseName = 'part_01' + //Extension = 'png' + //Directory = 'C:\\images\\' (on Windows systems) + // + //Explanation of the regular expressions: + // + //'([^\\\\/]*?)(?:\\.[^.]*)?$': + //To start at the end, the '$' matches the end of the string, + //so it is best to read the expression from right to left. + //The part in brackets (?:\\.[^.}*) denotes a non-capturing group. + //That means, that this part is matched, but not captured + //in contrast to the first bracketed group ([^\\\\/], see below.) + //\\.[^.]* matches a dot '.' followed by as many non-dots as possible. + //So (?:\\.[^.]*)? matches the file extension, if any. + //The '?' at the end assures, that even if no extension exists, + //a correct match is returned. + //The first part in brackets ([^\\\\/]*?) is a capture group, + //which means, that if a match is found, only the part in + //brackets is returned as a result. + //Because both HDevelop strings and regular expressions need a '\\' + //to describe a backslash, inside regular expressions within HDevelop + //a backslash has to be written as '\\\\'. + //[^\\\\/] matches any character but a slash or backslash ('\\' in HDevelop) + //[^\\\\/]*? matches a string od 0..n characters (except '/' or '\\') + //where the '?' after the '*' switches the greediness off, + //that means, that the shortest possible match is returned. + //This option is necessary to cut off the extension + //but only if (?:\\.[^.]*)? is able to match one. + //To summarize, the regular expression matches that part of + //the input string, that follows after the last '/' or '\\' and + //cuts off the extension (if any) after the last '.'. + // + //'\\.([^.]*)$': + //This matches everything after the last '.' of the input string. + //Because ([^.]) is a capturing group, + //only the part after the dot is returned. + // + //'.*[\\\\/]': + //This matches the longest substring with a '/' or a '\\' at the end. + // + TupleRegexpMatch(hv_FileName, ".*[\\\\/]", &hv_DirectoryTmp); + TupleSubstr(hv_FileName, hv_DirectoryTmp.TupleStrlen(), (hv_FileName.TupleStrlen())-1, + &hv_Substring); + TupleRegexpMatch(hv_Substring, "([^\\\\/]*?)(?:\\.[^.]*)?$", &(*hv_BaseName)); + TupleRegexpMatch(hv_Substring, "\\.([^.]*)$", &(*hv_Extension)); + // + // + //Finally all found backslashes ('\\') are converted + //to a slash to get consistent paths + TupleRegexpReplace(hv_DirectoryTmp, (HTuple("\\\\").Append("replace_all")), "/", + &(*hv_Directory)); + return; +} + +void pts_to_best_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Cols, HTuple hv_ActiveNum, + HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2) +{ + + // Local iconic variables + HObject ho_Contour; + + // Local control variables + HTuple hv_Length, hv_Nr, hv_Nc, hv_Dist, hv_Length1; + + //³õʼ»¯ + (*hv_Row1) = 0; + (*hv_Column1) = 0; + (*hv_Row2) = 0; + (*hv_Column2) = 0; + //²úÉúÒ»¸ö¿ÕµÄÖ±Ïß¶ÔÏó£¬ÓÃÓÚ±£´æÄâºÏºóµÄÖ±Ïß + GenEmptyObj(&(*ho_Line)); + //¼ÆËã±ßÔµÊýÁ¿ + TupleLength(hv_Cols, &hv_Length); + //µ±±ßÔµÊýÁ¿²»Ð¡ÓÚÓÐЧµãÊýʱ½øÐÐÄâºÏ + if (0 != (HTuple(hv_Length>=hv_ActiveNum).TupleAnd(hv_ActiveNum>1))) + { + //halconµÄÄâºÏÊÇ»ùÓÚxldµÄ£¬ÐèÒª°Ñ±ßÔµÁ¬½Ó³Éxld + GenContourPolygonXld(&ho_Contour, hv_Rows, hv_Cols); + //smooth_contours_xld (Contour, SmoothedContours, 5) + //ÄâºÏÖ±Ïß¡£Ê¹ÓõÄËã·¨ÊÇ'tukey'£¬ÆäËûËã·¨Çë²Î¿¼fit_line_contour_xldµÄÃèÊö²¿·Ö¡£ + //fit_line_contour_xld (Contour, 'tukey', |Rows|/3, |Rows|/3, 5, 2, Row1, Column1, Row2, Column2, Nr, Nc, Dist) + FitLineContourXld(ho_Contour, "tukey", -1, 0, 5, 2, &(*hv_Row1), &(*hv_Column1), + &(*hv_Row2), &(*hv_Column2), &hv_Nr, &hv_Nc, &hv_Dist); + //ÅжÏÄâºÏ½á¹ûÊÇ·ñÓÐЧ£ºÈç¹ûÄâºÏ³É¹¦£¬Êý×éÖÐÔªËØµÄÊýÁ¿´óÓÚ0 + TupleLength(hv_Dist, &hv_Length1); + if (0 != (hv_Length1<1)) + { + return; + } + //¸ù¾ÝÄâºÏ½á¹û£¬²úÉúÖ±Ïßxld + GenContourPolygonXld(&(*ho_Line), (*hv_Row1).TupleConcat((*hv_Row2)), (*hv_Column1).TupleConcat((*hv_Column2))); + } + + return; +} + +void pts_to_smooth_line (HObject *ho_Line, HTuple hv_Rows, HTuple hv_Columns, HTuple hv_ActiveNum, + HTuple *hv_Row1, HTuple *hv_Column1, HTuple *hv_Row2, HTuple *hv_Column2) +{ + + // Local iconic variables + HObject ho_Contour, ho_SmoothedContours1; + + // Local control variables + HTuple hv_Length, hv_Nr, hv_Nc, hv_Dist, hv_Length1; + + + + + //²úÉúÒ»¸ö¿ÕµÄÖ±Ïß¶ÔÏó£¬ÓÃÓÚ±£´æÄâºÏºóµÄÖ±Ïß + GenEmptyObj(&(*ho_Line)); + //¼ÆËã±ßÔµÊýÁ¿ + TupleLength(hv_Rows, &hv_Length); + //µ±±ßÔµÊýÁ¿²»Ð¡ÓÚÓÐЧµãÊýʱ½øÐÐÄâºÏ + if (0 != (hv_Length>=10)) + { + //halconµÄÄâºÏÊÇ»ùÓÚxldµÄ£¬ÐèÒª°Ñ±ßÔµÁ¬½Ó³Éxld + GenContourPolygonXld(&ho_Contour, hv_Rows, hv_Columns); + SmoothContoursXld(ho_Contour, &ho_SmoothedContours1, 15); + //ÄâºÏÖ±Ïß¡£Ê¹ÓõÄËã·¨ÊÇ'tukey'£¬ÆäËûËã·¨Çë²Î¿¼fit_line_contour_xldµÄÃèÊö²¿·Ö¡£ + //fit_line_contour_xld (SmoothedContours1, 'tukey', |Rows|/3, |Rows|/3, 5, 2, Row1, Column1, Row2, Column2, Nr, Nc, Dist) + FitLineContourXld(ho_SmoothedContours1, "tukey", -1, 0, 5, 2, &(*hv_Row1), &(*hv_Column1), + &(*hv_Row2), &(*hv_Column2), &hv_Nr, &hv_Nc, &hv_Dist); + + //ÅжÏÄâºÏ½á¹ûÊÇ·ñÓÐЧ£ºÈç¹ûÄâºÏ³É¹¦£¬Êý×éÖÐÔªËØµÄÊýÁ¿´óÓÚ0 + TupleLength(hv_Dist, &hv_Length1); + if (0 != (hv_Length1<1)) + { + return; + } + //¸ù¾ÝÄâºÏ½á¹û£¬²úÉúÖ±Ïßxld + GenContourPolygonXld(&(*ho_Line), (*hv_Row1).TupleConcat((*hv_Row2)), (*hv_Column1).TupleConcat((*hv_Column2))); + } + return; +} + +void rake (HObject ho_Image, HObject *ho_Regions, HTuple hv_Elements, HTuple hv_DetectHeight, + HTuple hv_DetectWidth, HTuple hv_Sigma, HTuple hv_Threshold, HTuple hv_Transition, + HTuple hv_Select, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2, HTuple hv_Column2, + HTuple *hv_ResultRow, HTuple *hv_ResultColumn) +{ + + // Local iconic variables + HObject ho_RegionLines, ho_Rectangle, ho_Arrow1; + HObject ho_Cross; + + // Local control variables + HTuple hv_Width, hv_Height, hv_ATan, hv_i, hv_RowC; + HTuple hv_ColC, hv_Distance, hv_RowL2, hv_RowL1, hv_ColL2; + HTuple hv_ColL1, hv_MsrHandle_Measure, hv_RowEdge, hv_ColEdge; + HTuple hv_Amplitude, hv_tRow, hv_tCol, hv_t, hv_Number; + HTuple hv_j; + + //»ñȡͼÏñ³ß´ç + GetImageSize(ho_Image, &hv_Width, &hv_Height); + //²úÉúÒ»¸ö¿ÕÏÔʾ¶ÔÏó£¬ÓÃÓÚÏÔʾ + GenEmptyObj(&(*ho_Regions)); + //³õʼ»¯±ßÔµ×ø±êÊý×é + (*hv_ResultRow) = HTuple(); + (*hv_ResultColumn) = HTuple(); + //²úÉúÖ±Ïßxld + GenContourPolygonXld(&ho_RegionLines, hv_Row1.TupleConcat(hv_Row2), hv_Column1.TupleConcat(hv_Column2)); + //´æ´¢µ½ÏÔʾ¶ÔÏó + ConcatObj((*ho_Regions), ho_RegionLines, &(*ho_Regions)); + //¼ÆËãÖ±ÏßÓëxÖáµÄ¼Ð½Ç£¬ÄæÊ±Õë·½ÏòΪÕýÏò¡£ + AngleLx(hv_Row1, hv_Column1, hv_Row2, hv_Column2, &hv_ATan); + + //±ßÔµ¼ì²â·½Ïò´¹Ö±ÓÚ¼ì²âÖ±ÏߣºÖ±Ïß·½ÏòÕýÏòÐýת90¡ãΪ±ßÔµ¼ì²â·½Ïò + hv_ATan += HTuple(90).TupleRad(); + + //¸ù¾Ý¼ì²âÖ±Ïß°´Ë³Ðò²úÉú²âÁ¿ÇøÓò¾ØÐΣ¬²¢´æ´¢µ½ÏÔʾ¶ÔÏó + { + HTuple end_val18 = hv_Elements; + HTuple step_val18 = 1; + for (hv_i=1; hv_i.Continue(end_val18, step_val18); hv_i += step_val18) + { + //RowC := Row1+(((Row2-Row1)*i)/(Elements+1)) + //ColC := Column1+(Column2-Column1)*i/(Elements+1) + //if (RowC>Height-1 or RowC<0 or ColC>Width-1 or ColC<0) + //continue + //endif + //Èç¹ûÖ»ÓÐÒ»¸ö²âÁ¿¾ØÐΣ¬×÷Ϊ¿¨³ß¹¤¾ß£¬¿í¶ÈΪ¼ì²âÖ±Ïߵij¤¶È + if (0 != (hv_Elements==1)) + { + hv_RowC = (hv_Row1+hv_Row2)*0.5; + hv_ColC = (hv_Column1+hv_Column2)*0.5; + //ÅжÏÊÇ·ñ³¬³öͼÏñ,³¬³ö²»¼ì²â±ßÔµ + if (0 != (HTuple(HTuple(HTuple(hv_RowC>(hv_Height-1)).TupleOr(hv_RowC<0)).TupleOr(hv_ColC>(hv_Width-1))).TupleOr(hv_ColC<0))) + { + continue; + } + DistancePp(hv_Row1, hv_Column1, hv_Row2, hv_Column2, &hv_Distance); + hv_DetectWidth = hv_Distance; + GenRectangle2ContourXld(&ho_Rectangle, hv_RowC, hv_ColC, hv_ATan, hv_DetectHeight/2, + hv_Distance/2); + } + else + { + //Èç¹ûÓжà¸ö²âÁ¿¾ØÐΣ¬²úÉú¸Ã²âÁ¿¾ØÐÎxld + hv_RowC = hv_Row1+(((hv_Row2-hv_Row1)*(hv_i-1))/(hv_Elements-1)); + hv_ColC = hv_Column1+(((hv_Column2-hv_Column1)*(hv_i-1))/(hv_Elements-1)); + //ÅжÏÊÇ·ñ³¬³öͼÏñ,³¬³ö²»¼ì²â±ßÔµ + if (0 != (HTuple(HTuple(HTuple(hv_RowC>(hv_Height-1)).TupleOr(hv_RowC<0)).TupleOr(hv_ColC>(hv_Width-1))).TupleOr(hv_ColC<0))) + { + continue; + } + GenRectangle2ContourXld(&ho_Rectangle, hv_RowC, hv_ColC, hv_ATan, hv_DetectHeight/2, + hv_DetectWidth/2); + } + + //°Ñ²âÁ¿¾ØÐÎxld´æ´¢µ½ÏÔʾ¶ÔÏó + ConcatObj((*ho_Regions), ho_Rectangle, &(*ho_Regions)); + if (0 != (hv_i==1)) + { + //ÔÚµÚÒ»¸ö²âÁ¿¾ØÐλæÖÆÒ»¸ö¼ýÍ·xld£¬ÓÃÓÚÖ»ÊDZßÔµ¼ì²â·½Ïò + hv_RowL2 = hv_RowC+((hv_DetectHeight/2)*((-hv_ATan).TupleSin())); + hv_RowL1 = hv_RowC-((hv_DetectHeight/2)*((-hv_ATan).TupleSin())); + hv_ColL2 = hv_ColC+((hv_DetectHeight/2)*((-hv_ATan).TupleCos())); + hv_ColL1 = hv_ColC-((hv_DetectHeight/2)*((-hv_ATan).TupleCos())); + gen_arrow_contour_xld(&ho_Arrow1, hv_RowL1, hv_ColL1, hv_RowL2, hv_ColL2, 25, + 25); + //°Ñxld´æ´¢µ½ÏÔʾ¶ÔÏó + ConcatObj((*ho_Regions), ho_Arrow1, &(*ho_Regions)); + } + //²úÉú²âÁ¿¶ÔÏó¾ä±ú + GenMeasureRectangle2(hv_RowC, hv_ColC, hv_ATan, hv_DetectHeight/2, hv_DetectWidth/2, + hv_Width, hv_Height, "nearest_neighbor", &hv_MsrHandle_Measure); + + + //ÉèÖü«ÐÔ + if (0 != (hv_Transition==HTuple("negative"))) + { + hv_Transition = "negative"; + } + else + { + if (0 != (hv_Transition==HTuple("positive"))) + { + + hv_Transition = "positive"; + } + else + { + hv_Transition = "all"; + } + } + //ÉèÖñßԵλÖá£×îÇ¿µãÊÇ´ÓËùÓбßÔµÖÐÑ¡Ôñ·ù¶È¾ø¶ÔÖµ×î´óµã£¬ÐèÒªÉèÖÃΪ'all' + if (0 != (hv_Select==HTuple("first"))) + { + hv_Select = "first"; + } + else + { + if (0 != (hv_Select==HTuple("last"))) + { + + hv_Select = "last"; + } + else + { + hv_Select = "all"; + } + } + //¼ì²â±ßÔµ + MeasurePos(ho_Image, hv_MsrHandle_Measure, hv_Sigma, hv_Threshold, hv_Transition, + hv_Select, &hv_RowEdge, &hv_ColEdge, &hv_Amplitude, &hv_Distance); + //Çå³ý²âÁ¿¶ÔÏó¾ä±ú + CloseMeasure(hv_MsrHandle_Measure); + GenCrossContourXld(&ho_Cross, hv_RowEdge, hv_ColEdge, 6, 0.785398); + //ÁÙʱ±äÁ¿³õʼ»¯ + //tRow£¬tCol±£´æÕÒµ½Ö¸¶¨±ßÔµµÄ×ø±ê + hv_tRow = 0; + hv_tCol = 0; + //t±£´æ±ßÔµµÄ·ù¶È¾ø¶ÔÖµ + hv_t = 0; + //ÕÒµ½µÄ±ßÔµ±ØÐëÖÁÉÙΪ1¸ö + TupleLength(hv_RowEdge, &hv_Number); + if (0 != (hv_Number<1)) + { + continue; + } + //Óжà¸ö±ßԵʱ£¬Ñ¡Ôñ·ù¶È¾ø¶ÔÖµ×î´óµÄ±ßÔµ + { + HTuple end_val101 = hv_Number-1; + HTuple step_val101 = 1; + for (hv_j=0; hv_j.Continue(end_val101, step_val101); hv_j += step_val101) + { + if (0 != ((HTuple(hv_Amplitude[hv_j]).TupleAbs())>hv_t)) + { + + hv_tRow = HTuple(hv_RowEdge[hv_j]); + hv_tCol = HTuple(hv_ColEdge[hv_j]); + hv_t = HTuple(hv_Amplitude[hv_j]).TupleAbs(); + } + } + } + //°ÑÕÒµ½µÄ±ßÔµ±£´æÔÚÊä³öÊý×é + if (0 != (hv_t>0)) + { + (*hv_ResultRow) = (*hv_ResultRow).TupleConcat(hv_tRow); + (*hv_ResultColumn) = (*hv_ResultColumn).TupleConcat(hv_tCol); + } + } + } + + return; +} + +// Chapter: Graphics / Text +// Short Description: Set font independent of OS +void set_display_font (HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font, HTuple hv_Bold, + HTuple hv_Slant) +{ + + // Local iconic variables + + // Local control variables + HTuple hv_OS, hv_Fonts, hv_Style, hv_Exception; + HTuple hv_AvailableFonts, hv_Fdx, hv_Indices; + + //This procedure sets the text font of the current window with + //the specified attributes. + // + //Input parameters: + //WindowHandle: The graphics window for which the font will be set + //Size: The font size. If Size=-1, the default of 16 is used. + //Bold: If set to 'true', a bold font is used + //Slant: If set to 'true', a slanted font is used + // + GetSystem("operating_system", &hv_OS); + if (0 != (HTuple(hv_Size==HTuple()).TupleOr(hv_Size==-1))) + { + hv_Size = 16; + } + if (0 != ((hv_OS.TupleSubstr(0,2))==HTuple("Win"))) + { + //Restore previous behaviour + hv_Size = (1.13677*hv_Size).TupleInt(); + } + else + { + hv_Size = hv_Size.TupleInt(); + } + if (0 != (hv_Font==HTuple("Courier"))) + { + hv_Fonts.Clear(); + hv_Fonts[0] = "Courier"; + hv_Fonts[1] = "Courier 10 Pitch"; + hv_Fonts[2] = "Courier New"; + hv_Fonts[3] = "CourierNew"; + hv_Fonts[4] = "Liberation Mono"; + } + else if (0 != (hv_Font==HTuple("mono"))) + { + hv_Fonts.Clear(); + hv_Fonts[0] = "Consolas"; + hv_Fonts[1] = "Menlo"; + hv_Fonts[2] = "Courier"; + hv_Fonts[3] = "Courier 10 Pitch"; + hv_Fonts[4] = "FreeMono"; + hv_Fonts[5] = "Liberation Mono"; + } + else if (0 != (hv_Font==HTuple("sans"))) + { + hv_Fonts.Clear(); + hv_Fonts[0] = "Luxi Sans"; + hv_Fonts[1] = "DejaVu Sans"; + hv_Fonts[2] = "FreeSans"; + hv_Fonts[3] = "Arial"; + hv_Fonts[4] = "Liberation Sans"; + } + else if (0 != (hv_Font==HTuple("serif"))) + { + hv_Fonts.Clear(); + hv_Fonts[0] = "Times New Roman"; + hv_Fonts[1] = "Luxi Serif"; + hv_Fonts[2] = "DejaVu Serif"; + hv_Fonts[3] = "FreeSerif"; + hv_Fonts[4] = "Utopia"; + hv_Fonts[5] = "Liberation Serif"; + } + else + { + hv_Fonts = hv_Font; + } + hv_Style = ""; + if (0 != (hv_Bold==HTuple("true"))) + { + hv_Style += HTuple("Bold"); + } + else if (0 != (hv_Bold!=HTuple("false"))) + { + hv_Exception = "Wrong value of control parameter Bold"; + throw HException(hv_Exception); + } + if (0 != (hv_Slant==HTuple("true"))) + { + hv_Style += HTuple("Italic"); + } + else if (0 != (hv_Slant!=HTuple("false"))) + { + hv_Exception = "Wrong value of control parameter Slant"; + throw HException(hv_Exception); + } + if (0 != (hv_Style==HTuple(""))) + { + hv_Style = "Normal"; + } + QueryFont(hv_WindowHandle, &hv_AvailableFonts); + hv_Font = ""; + { + HTuple end_val48 = (hv_Fonts.TupleLength())-1; + HTuple step_val48 = 1; + for (hv_Fdx=0; hv_Fdx.Continue(end_val48, step_val48); hv_Fdx += step_val48) + { + hv_Indices = hv_AvailableFonts.TupleFind(HTuple(hv_Fonts[hv_Fdx])); + if (0 != ((hv_Indices.TupleLength())>0)) + { + if (0 != (HTuple(hv_Indices[0])>=0)) + { + hv_Font = HTuple(hv_Fonts[hv_Fdx]); + break; + } + } + } + } + if (0 != (hv_Font==HTuple(""))) + { + throw HException("Wrong value of control parameter Font"); + } + hv_Font = (((hv_Font+"-")+hv_Style)+"-")+hv_Size; + SetFont(hv_WindowHandle, hv_Font); + return; +} + +#ifndef NO_EXPORT_MAIN +// Main procedure +void action() +{ + + // Local iconic variables + HObject ho_in_image, ho_LineRegion, ho_RegionLines; + HObject ho_RegionLines1, ho_CopyImage1, ho_CopyImage2, ho_CopyImage3; + HObject ho_MultiChannelImage, ho_RegionDilation; + + // Local control variables + HTuple hv_In_Resolution, hv_ImagePath, hv_ImageFiles; + HTuple hv_in_ProductType, hv_WindowHandle, hv_Index, hv_BaseName; + HTuple hv_Extension, hv_Directory, hv_T1, hv_out_standardPar; + HTuple hv_out_Flag, hv_out_disLeftVertical, hv_out_LeftVerticalLinePar; + HTuple hv_out_disLeftLevel, hv_out_LeftLevelLinePar, hv_out_disRightVertical; + HTuple hv_out_RightVerticalLinePar, hv_out_disRightLevel; + HTuple hv_out_RightLevelLinePar, hv_T2, hv_T, hv_index1; + HTuple hv_index2, hv_index3, hv_index4, hv_index5; + + // import(...); only in hdevelop + + //Ïà»ú¾«¶È. + hv_In_Resolution = 0.032; + //ͼÏñ·¾¶ + hv_ImagePath = "C:/Users/86198/Desktop/AÎóÅÐ"; + //ÐòÁл¯Í¼Ïñ·¾¶ + list_image_files(hv_ImagePath, "default", HTuple(), &hv_ImageFiles); + + //ÓÅ»¯ÄÚÈÝ: + //1,185-2ͼÏñͨµÀ²»Ò»ÖµÄÎÊÌâ.(¸ÄÆØ¹â) + //2,185-2µÄAºÍBͨµÀ²úÆ·²»Ò»ÖÂÎÊÌâ, + //3, ÂÁ°å¸½½üµÄ±ßÔµ½ºÈçºÎ½øÐд¦Àí, + + //in_ProductType := '181-1' + hv_in_ProductType = "181-2"; + + //in_ProductType := '185-1' + //in_ProductType := '185-2' + //in_ProductType := '186-1' + //in_ProductType := '186-2' + + + if (HDevWindowStack::IsOpen()) + hv_WindowHandle = HDevWindowStack::GetActive(); + set_display_font(hv_WindowHandle, 20, "mono", "true", "false"); + { + HTuple end_val25 = (hv_ImageFiles.TupleLength())-1; + HTuple step_val25 = 1; + for (hv_Index=0; hv_Index.Continue(end_val25, step_val25); hv_Index += step_val25) + { + ReadImage(&ho_in_image, HTuple(hv_ImageFiles[hv_Index])); + parse_filename(HTuple(hv_ImageFiles[hv_Index]), &hv_BaseName, &hv_Extension, + &hv_Directory); + CountSeconds(&hv_T1); + cal_distanceJiao_4(ho_in_image, hv_in_ProductType, &hv_out_standardPar, &hv_out_Flag, + &hv_out_disLeftVertical, &hv_out_LeftVerticalLinePar, &hv_out_disLeftLevel, + &hv_out_LeftLevelLinePar, &hv_out_disRightVertical, &hv_out_RightVerticalLinePar, + &hv_out_disRightLevel, &hv_out_RightLevelLinePar); + CountSeconds(&hv_T2); + + hv_T = hv_T2-hv_T1; + if (0 != (hv_out_Flag==1)) + { + if (HDevWindowStack::IsOpen()) + ClearWindow(HDevWindowStack::GetActive()); + if (HDevWindowStack::IsOpen()) + DispObj(ho_in_image, HDevWindowStack::GetActive()); + disp_message(hv_WindowHandle, "δץµ½Ïß", "window", 100, 100, "green", "false"); + // stop(...); only in hdevelop + continue; + } + //stop () + GenEmptyRegion(&ho_LineRegion); + //µ÷ÊÔ, »­ÏßÓÃ, + { + HTuple end_val43 = (hv_out_LeftVerticalLinePar.TupleLength())-1; + HTuple step_val43 = 4; + for (hv_index1=0; hv_index1.Continue(end_val43, step_val43); hv_index1 += step_val43) + { + GenRegionLine(&ho_RegionLines, HTuple(hv_out_LeftVerticalLinePar[hv_index1]), + HTuple(hv_out_LeftVerticalLinePar[hv_index1+1]), HTuple(hv_out_LeftVerticalLinePar[hv_index1+2]), + HTuple(hv_out_LeftVerticalLinePar[hv_index1+3])); + Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); + } + } + + { + HTuple end_val48 = (hv_out_LeftVerticalLinePar.TupleLength())-1; + HTuple step_val48 = 4; + for (hv_index2=0; hv_index2.Continue(end_val48, step_val48); hv_index2 += step_val48) + { + GenRegionLine(&ho_RegionLines, HTuple(hv_out_LeftLevelLinePar[hv_index2]), + HTuple(hv_out_LeftLevelLinePar[hv_index2+1]), HTuple(hv_out_LeftLevelLinePar[hv_index2+2]), + HTuple(hv_out_LeftLevelLinePar[hv_index2+3])); + + Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); + } + } + + { + HTuple end_val54 = (hv_out_RightVerticalLinePar.TupleLength())-1; + HTuple step_val54 = 4; + for (hv_index3=0; hv_index3.Continue(end_val54, step_val54); hv_index3 += step_val54) + { + GenRegionLine(&ho_RegionLines, HTuple(hv_out_RightVerticalLinePar[hv_index3]), + HTuple(hv_out_RightVerticalLinePar[hv_index3+1]), HTuple(hv_out_RightVerticalLinePar[hv_index3+2]), + HTuple(hv_out_RightVerticalLinePar[hv_index3+3])); + + Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); + } + } + + { + HTuple end_val60 = (hv_out_RightLevelLinePar.TupleLength())-1; + HTuple step_val60 = 4; + for (hv_index4=0; hv_index4.Continue(end_val60, step_val60); hv_index4 += step_val60) + { + GenRegionLine(&ho_RegionLines, HTuple(hv_out_RightLevelLinePar[hv_index4]), + HTuple(hv_out_RightLevelLinePar[hv_index4+1]), HTuple(hv_out_RightLevelLinePar[hv_index4+2]), + HTuple(hv_out_RightLevelLinePar[hv_index4+3])); + Union2(ho_LineRegion, ho_RegionLines, &ho_LineRegion); + } + } + + { + HTuple end_val65 = (hv_out_standardPar.TupleLength())-1; + HTuple step_val65 = 4; + for (hv_index5=0; hv_index5.Continue(end_val65, step_val65); hv_index5 += step_val65) + { + + GenRegionLine(&ho_RegionLines1, HTuple(hv_out_standardPar[hv_index5]), HTuple(hv_out_standardPar[hv_index5+1]), + HTuple(hv_out_standardPar[hv_index5+2]), HTuple(hv_out_standardPar[hv_index5+3])); + + Union2(ho_LineRegion, ho_RegionLines1, &ho_LineRegion); + } + } + + CopyImage(ho_in_image, &ho_CopyImage1); + CopyImage(ho_in_image, &ho_CopyImage2); + CopyImage(ho_in_image, &ho_CopyImage3); + Compose3(ho_CopyImage1, ho_CopyImage2, ho_CopyImage3, &ho_MultiChannelImage); + DilationCircle(ho_LineRegion, &ho_RegionDilation, 5.5); + OverpaintRegion(ho_MultiChannelImage, ho_RegionDilation, ((HTuple(255).Append(0)).Append(0)), + "fill"); + + if (HDevWindowStack::IsOpen()) + DispObj(ho_MultiChannelImage, HDevWindowStack::GetActive()); + disp_message(hv_WindowHandle, hv_out_disLeftVertical*hv_In_Resolution, "window", + 100, 100, "green", "false"); + disp_message(hv_WindowHandle, hv_out_disLeftLevel*hv_In_Resolution, "window", + 100, 300, "green", "false"); + + disp_message(hv_WindowHandle, hv_out_disRightVertical*hv_In_Resolution, "window", + 100, 700, "green", "false"); + disp_message(hv_WindowHandle, hv_out_disRightLevel*hv_In_Resolution, "window", + 100, 900, "green", "false"); + // stop(...); only in hdevelop + } + } + + // stop(...); only in hdevelop + + +} + + + + +#endif + + diff --git a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.cpp b/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.cpp new file mode 100644 index 0000000..3874af8 --- /dev/null +++ b/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.cpp @@ -0,0 +1,8 @@ +#include <581_YuHan_hanqian.h> + +mission* createMission() { + return new _581_YuHan_hanqian(); +} +void destroyMission(mission* _mission) { + delete _mission; +} \ No newline at end of file diff --git a/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h b/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h new file mode 100644 index 0000000..d0ca3b1 --- /dev/null +++ b/src/mission/581_YuHan_hanqian/581_YuHan_hanqian.h @@ -0,0 +1,255 @@ +#include +#include +#pragma region 算法 +#include +#include +#include +using namespace HDevEngineCpp; +#pragma endregion +class yuHanHanQianParams { +public: + handleAiModelSeg* segDingWei = nullptr; + + handleAiModelSeg* segJiErFanZhe = nullptr; + handleAiModelCls* clsJiErFanZhe = nullptr; +}; +void halconProcess(cv::Mat& sourceImg, cv::Mat& Paint) { + try { + HDevEngineCpp::HDevProcedure proc("Inspection_YH_JE"); + HDevEngineCpp::HDevProcedureCall procedureCall(proc); + HObject in_Image = MatToHObject(sourceImg); + procedureCall.SetInputIconicParamObject("in_Image", in_Image);//设置输入图åƒ�ç±»å�˜é‡� + procedureCall.Execute();//执行halcon程åº� + HTuple out_X, out_Y, out_Flag; + out_X = procedureCall.GetOutputCtrlParamTuple("out_X"); + out_Y = procedureCall.GetOutputCtrlParamTuple("out_Y"); + out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag"); + if (out_Flag.D() == 0) { + for (int i = 0; i < out_X.Length(); i++) + Paint.at(out_X[i].D(), out_Y[i].D()) = { 255,255,0 }; + } + } + catch (HDevEngineCpp::HDevEngineException& ex) { + + std::cout << "HDevEngineException: " << ex.Message() << std::endl; \ + qDebug() << "HDevEngineException: " << ex.Message(); \ + } + catch (HalconCpp::HException& ex) { + + std::cout << "Halcon Exception Caught!" << std::endl; \ + std::cout << "Error Code: " << ex.ErrorCode() << std::endl; \ + std::cout << "Error Message: " << ex.ErrorMessage() << std::endl; \ + qDebug() << "Halcon Exception Caught!"; \ + qDebug() << "Error Code: " << ex.ErrorCode(); \ + qDebug() << "Error Message: " << ex.ErrorMessage(); \ + } +} +cv::Rect getImageLocateRect(cv::Mat& src, handdleAI::pSegmentation* seg, double bounus = 0.1) { + cv::Mat tmpImg; + cv::resize(src, tmpImg, cv::Size(), bounus, bounus); + cv::Mat ouput = ~seg->Evaluate(tmpImg); + auto rect = findMaxAreaContour(ouput); + rect.x /= bounus; rect.y /= bounus; + rect.width /= bounus; rect.height /= bounus; + return rect; +} +bool handleAiProcess(cv::Mat& seg_detImg, cv::Mat& seg_Paint, + handdleAI::pSegmentation* segPtr, handdleAI::pClassification* clsPtr, + std::vector< std::pair >& clsImgs){ + cv::Mat segResizeImg; + float resizeRate = 1.0; + cv::resize(seg_detImg, segResizeImg, cv::Size(), 1.0 / resizeRate, 1.0 / resizeRate); + cv::Mat seg_ResultImg = ~segPtr->Evaluate(segResizeImg); + cv::resize(seg_ResultImg, seg_ResultImg, cv::Size(), resizeRate, resizeRate); + std::vector> contours; + cv::findContours(seg_ResultImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + bool finalNg = false; + for (int i = 0; i < contours.size(); i++) + { + cv::Rect cls_rect = cv::boundingRect(contours[i]); + if (cls_rect.width < 50 || cls_rect.height < 50) + continue; +#if 1 + std::vector clsImgVec = cutImg2ClsVec(cls_rect, seg_detImg); + std::vector clsRes;//true ok + bool isNg = false; + for (auto& cls : clsImgVec) { + cv::resize(cls, cls, cv::Size(128, 128));//æ ¹æ�®éœ€è¦�设定大å°� + int Result = clsPtr->Evaluate(cls); + if (Result != 0)isNg = true; + clsRes.push_back(Result); + clsImgs.push_back({ std::to_string(Result) ,cls }); + } + if (isNg == true) { + cv::Scalar color = cv::Scalar(0, 255, 255, 30); + cv::rectangle(seg_Paint, cls_rect, color, 4); + drawContours(seg_Paint, contours, i, cv::Scalar(0, 0, 255, 30), 3); + finalNg = true; + } + else { + //drawContours(seg_Paint, contours, i, cv::Scalar(0, 255, 0, 30), 3); + } +#else + bool isNg = false; + cv::Mat clsImage = cutLabelImg(seg_detImg, 200, 200, cls_rect, 0, 1, 1); + int Result = clsPtr->Evaluate(clsImage); + if (Result != 0) { + isNg = true; + cv::Scalar color = cv::Scalar(0, 255, 255, 30); + cv::rectangle(seg_Paint, cls_rect, color, 4); + drawContours(seg_Paint, contours, i, cv::Scalar(0, 0, 255, 30), 3); + finalNg = true; + } + else { + + } + clsImgs.push_back({ Result , clsImage }); +#endif + } + return finalNg; +} +bool jiErFanZhe(std::shared_ptr data, yuHanHanQianParams* _detParams, sx_581_address address) { + try{ +#if 0 + /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ + cv::Mat resultImage = img2D.clone(); + if (resultImage.channels() == 1) { + cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR); + } + QString okng_tag = "OK"; + cv::Mat seg_detectImage; + cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1); + plcResult = "1"; + bool isNG = false; + if (DOGLIVE) { + std::vector>clsImgs; + bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs); + for (int i = 0; i < clsImgs.size(); i++) { + addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first)); + } + } + if (isNG == false)//OK + { + putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200); + okng_tag = "OK"; + } + else + { + putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200); + plcResult = "2"; + } + cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5); + resMat.push_back(resultImage); + if (resMat.size() > 0) + { + addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//å­˜seg图 + addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图 + } + addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图 + + return true; + /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ +#else + //存图数æ�®åŠ ä¿�存队列,加é”�,é�¿å…�æ•°æ�®è®¿é—®å†²çª� + QByteArray plcResult = "2"; + cv::Mat sourceImg; + data->oriImgs[0].copyTo(sourceImg); + cv::Mat Paint; + sourceImg.copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + halconProcess(sourceImg, Paint); + float resizeRate = 5.0; + auto rect = getImageLocateRect(sourceImg, _detParams->segDingWei->segPtr, 1.0 / resizeRate);//定ä½� + rect = rect & (cv::Rect(0, 0, sourceImg.cols, sourceImg.rows));//防止越界 + bool isNG = false; + cv::Mat seg_saveImg; + if (rect.width > 500 || rect.height > 500) { + isNG = handleAiProcess(sourceImg(rect), Paint(rect), _detParams->segJiErFanZhe->segPtr, _detParams->clsJiErFanZhe->clsPtr, data->clsOriginImgs); + cv::rectangle(Paint, rect, cv::Scalar(0, 255, 255), 3); + cv::resize(sourceImg(rect), seg_saveImg, cv::Size(), 0.5, 0.5); + } + else { + isNG = true; + } + QString okNgSaveText = "NG"; + TextRendererZH textPainter(Paint.cols, Paint.rows, 15); + if (isNG == false)//OK + { + textPainter.putText(Paint, "OK", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); + okNgSaveText = "OK"; + } + else + { + textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); + data->aiDetOK = false; + plcResult = "2"; + } + plcResult = "1";//强制OK + data->resultImgs.push_back(Paint); + sourceImg.release(); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果å��馈 +#endif + } + CATCH_EXCEPTIONS + + qDebug() << "[Error] " << QString::fromUtf8("检测失败!"); + cv::Mat Paint; + data->oriImgs[0].copyTo(Paint); + if (Paint.channels() == 1) + cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR); + TextRendererZH textPainter(Paint.cols, Paint.rows, 15); + textPainter.putText(Paint, "NG", cv::Point(1000, 50), cv::Scalar(0, 255, 0)); + cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5); + data->resultImgs.push_back(Paint); + data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//结果å��馈 + return true; +} +class _581_YuHan_hanqian : public mission { +public: + _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_lv_top_1; + _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_lv_down_2; + _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_tong_top_3; + _581_SX_Single_triggerTemplate< yuHanHanQianParams> in_tong_down_4; + + _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_lv_top_5; + _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_lv_down_6; + _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_tong_top_7; + _581_SX_Single_triggerTemplate< yuHanHanQianParams> out_tong_down_8; + yuHanHanQianParams tongDetParams; + yuHanHanQianParams lvDetParams; + void onConfigReloaded() { + HDevEngineCpp::HDevEngine myEngine; + myEngine.SetProcedurePath("./halconAlgoFiles/AlgoLibrary_602.hdpl"); + + tongDetParams.segDingWei = _serviceManager->_handleAiModelManager->getSegModel("segDingWei_GPU0"); + tongDetParams.segJiErFanZhe = _serviceManager->_handleAiModelManager->getSegModel("segTongJiErFanZhe_GPU0"); + tongDetParams.clsJiErFanZhe = _serviceManager->_handleAiModelManager->getClsModel("clsTongJiErFanZhe_GPU0"); + + + lvDetParams.segDingWei = _serviceManager->_handleAiModelManager->getSegModel("clsLvJiErFanZhe_GPU1"); + lvDetParams.segJiErFanZhe = _serviceManager->_handleAiModelManager->getSegModel("segLvJiErFanZhe_GPU1"); + lvDetParams.clsJiErFanZhe = _serviceManager->_handleAiModelManager->getClsModel("clsLvJiErFanZhe_GPU1"); + + } + bool initCustom() { +#pragma region 注册触å�‘器回调 + in_lv_top_1.init("Camera1", "æž�耳翻折-é“�-内-相机1(顶部)", { { 522, 1,540,"523","530",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe); + in_lv_down_2.init("Camera2", "æž�耳翻折-é“�-内-相机2(底部)", { { 524, 1,620,"525","532",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe); + in_tong_top_3.init("Camera3", "æž�耳翻折-铜-内-相机3(顶部)", { { 526,1,540,"527","534",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe); + in_tong_down_4.init("Camera4", "æž�耳翻折-铜-内-相机4(底部)", { { 528, 1,620,"529","536",-1} }, 1, tongDetParams, _serviceManager, bridge, jiErFanZhe); + + out_lv_top_5.init("Camera5", "æž�耳翻折-é“�-外-相机5(顶部)", { { 562,1,580,"563","570",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe); + out_lv_down_6.init("Camera6", "æž�耳翻折-é“�-外-相机6(底部)", { { 564, 1,660,"565","572",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe); + out_tong_top_7.init("Camera7", "æž�耳翻折-铜-外-相机7(顶部)", { { 566, 1,580,"567","574",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe); + out_tong_down_8.init("Camera8", "æž�耳翻折-铜-外-相机8(底部)", { { 568, 1,660,"569","576",-1} }, 1, lvDetParams, _serviceManager, bridge, jiErFanZhe); +#pragma endregion + return true; + } +}; + + + + + +#pragma once \ No newline at end of file diff --git a/src/mission/581_YuHan_hanqian/CMakeLists.txt b/src/mission/581_YuHan_hanqian/CMakeLists.txt new file mode 100644 index 0000000..bba2e81 --- /dev/null +++ b/src/mission/581_YuHan_hanqian/CMakeLists.txt @@ -0,0 +1,78 @@ +# 获å�–获å�–当å‰�目录å�� +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "opencv" "halcon" "handdleAI") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + ${PROJECT_ROOT_PATH}/src/core + ${PROJECT_ROOT_PATH}/src/core/handleAi + ${PROJECT_ROOT_PATH}/src/core/back + ${PROJECT_ROOT_PATH}/src/core/sql + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) +add_compile_options(/utf-8) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Sql REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ${PROJECT_ROOT_PATH}/include/qtBridge.h + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Sql + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME}) +message( " header files "${HEAD_FILES})