wenluderen
论坛版主
论坛版主
  • 最后登录2018-08-13
  • 发帖数313
  • 金币5557枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:14437回复:153

实战:在VS 执行 二维码检测。

楼主#
更多 发布于:2015-01-31 14:40
前言:本帖子使用是框架已经提前写好,如果需要请到我的帖子中下载。
http://www.ihalcon.com/read-2847.html
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××8
废话不错了 直接开工。
第一步:在对话框CCD模组里面添加图片控件(picture control)

图片:2015-01-31_143817.jpg



效果如下

图片:2015-01-31_144114.jpg



修改图片控件的ID号为:IDC_STATIC_GSZCCD
喜欢11

最新打赏:0人

wenluderen
论坛版主
论坛版主
  • 最后登录2018-08-13
  • 发帖数313
  • 金币5557枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2015-01-31 15:11
第二步:将HALCON转化出来的CPP源码添加到CGszBoardDialog类的头文件和实现文件里面。
头文件里需要添加是的:

public:
 HObject  ho_Image, ho_GrayImage, ho_SymbolXLDs;
 // Local control variables
 HTuple  hv_WindowHandle, hv_DataCodeHandle, hv_ResultHandles;
 HTuple  hv_DecodedDataStrings;
  


public:
 void disp_message (HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,
 HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box);


 实现文件里需要添加的是:

//HALCON 用到的函数定义下
void  CGszCcdDialog::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_Red, hv_Green, hv_Blue, hv_Row1Part;
 HTuple  hv_Column1Part, hv_Row2Part, hv_Column2Part, hv_RowWin;
 HTuple  hv_ColumnWin, hv_WidthWin, hv_HeightWin, hv_MaxAscent;
 HTuple  hv_MaxDescent, hv_MaxWidth, hv_MaxHeight, hv_R1;
 HTuple  hv_C1, hv_FactorRow, hv_FactorColumn, hv_UseShadow;
 HTuple  hv_ShadowColor, hv_Exception, hv_Width, hv_Index;
 HTuple  hv_Ascent, hv_Descent, hv_W, hv_H, hv_FrameHeight;
 HTuple  hv_FrameWidth, hv_R2, hv_C2, hv_DrawMode, hv_CurrentColor;


 //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
 //   If set to -1, a default value of 12 is used.
 //Column: The column coordinate of the desired text position
 //   If set to -1, a default value of 12 is used.
 //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
 //   for each new textline.
 //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 (same as if no second value is given)
 //       otherwise -> use given string as color string for the shadow color
 //
 //Prepare window
 GetRgb(hv_WindowHandle, &hv_Red, &hv_Green, &hv_Blue);
 GetPart(hv_WindowHandle, &hv_Row1Part, &hv_Column1Part, &hv_Row2Part, &hv_Column2Part);
 GetWindowExtents(hv_WindowHandle, &hv_RowWin, &hv_ColumnWin, &hv_WidthWin, &hv_HeightWin);
 SetPart(hv_WindowHandle, 0, 0, hv_HeightWin-1, hv_WidthWin-1);
 //
 //default settings
 if (0 != (hv_Row==-1))
 {
 hv_Row = 12;
 }
 if (0 != (hv_Column==-1))
 {
 hv_Column = 12;
 }
 if (0 != (hv_Color==HTuple()))
 {
 hv_Color = "";
 }
 //
 hv_String = ((""+hv_String)+"").TupleSplit("\n");
 //
 //Estimate extentions of text depending on font size.
 GetFontExtents(hv_WindowHandle, &hv_MaxAscent, &hv_MaxDescent, &hv_MaxWidth, &hv_MaxHeight);
 if (0 != (hv_CoordSystem==HTuple("window")))
 {
 hv_R1 = hv_Row;
 hv_C1 = hv_Column;
 }
 else
 {
 //Transform image to window coordinates
 hv_FactorRow = (1.*hv_HeightWin)/((hv_Row2Part-hv_Row1Part)+1);
 hv_FactorColumn = (1.*hv_WidthWin)/((hv_Column2Part-hv_Column1Part)+1);
 hv_R1 = ((hv_Row-hv_Row1Part)+0.5)*hv_FactorRow;
 hv_C1 = ((hv_Column-hv_Column1Part)+0.5)*hv_FactorColumn;
 }
 //
 //Display text box depending on text size
 hv_UseShadow = 1;
 hv_ShadowColor = "gray";
 if (0 != (HTuple(hv_Box[0])==HTuple("true")))
 {
 hv_Box[0] = "#fce9d4";
 hv_ShadowColor = "#f28d26";
 }
 if (0 != ((hv_Box.TupleLength())>1))
 {
 if (0 != (HTuple(hv_Box[1])==HTuple("true")))
 {
 //Use default ShadowColor set above
 }
 else if (0 != (HTuple(hv_Box[1])==HTuple("false")))
 {
 hv_UseShadow = 0;
 }
 else
 {
 hv_ShadowColor = ((const HTuple&)hv_Box)[1];
 //Valid color?
 try
 {
 SetColor(hv_WindowHandle, HTuple(hv_Box[1]));
 }
 // catch (Exception)
 catch (HalconCpp::HException &HDevExpDefaultException)
 {
 HDevExpDefaultException.ToHTuple(&hv_Exception);
 hv_Exception = "Wrong value of control parameter Box[1] (must be a 'true', 'false', or a valid color string)";
 throw HalconCpp::HException(hv_Exception);
 }
 }
 }
 if (0 != (HTuple(hv_Box[0])!=HTuple("false")))
 {
 //Valid color?
 try
 {
 SetColor(hv_WindowHandle, HTuple(hv_Box[0]));
 }
 // catch (Exception)
 catch (HalconCpp::HException &HDevExpDefaultException)
 {
 HDevExpDefaultException.ToHTuple(&hv_Exception);
 hv_Exception = "Wrong value of control parameter Box[0] (must be a 'true', 'false', or a valid color string)";
 throw HalconCpp::HException(hv_Exception);
 }
 //Calculate box extents
 hv_String = (" "+hv_String)+" ";
 hv_Width = HTuple();
 {
 HTuple end_val93 = (hv_String.TupleLength())-1;
 HTuple step_val93 = 1;
 for (hv_Index=0; hv_Index.Continue(end_val93, step_val93); hv_Index += step_val93)
 {
 GetStringExtents(hv_WindowHandle, HTuple(hv_String[hv_Index]), &hv_Ascent,
 &hv_Descent, &hv_W, &hv_H);
 hv_Width = hv_Width.TupleConcat(hv_W);
 }
 }
 hv_FrameHeight = hv_MaxHeight*(hv_String.TupleLength());
 hv_FrameWidth = (HTuple(0).TupleConcat(hv_Width)).TupleMax();
 hv_R2 = hv_R1+hv_FrameHeight;
 hv_C2 = hv_C1+hv_FrameWidth;
 //Display rectangles
 GetDraw(hv_WindowHandle, &hv_DrawMode);
 SetDraw(hv_WindowHandle, "fill");
 //Set shadow color
 SetColor(hv_WindowHandle, hv_ShadowColor);
 if (0 != hv_UseShadow)
 {
 DispRectangle1(hv_WindowHandle, hv_R1+1, hv_C1+1, hv_R2+1, hv_C2+1);
 }
 //Set box color
 SetColor(hv_WindowHandle, HTuple(hv_Box[0]));
 DispRectangle1(hv_WindowHandle, hv_R1, hv_C1, hv_R2, hv_C2);
 SetDraw(hv_WindowHandle, hv_DrawMode);
 }
 //Write text.
 {
 HTuple end_val115 = (hv_String.TupleLength())-1;
 HTuple step_val115 = 1;
 for (hv_Index=0; hv_Index.Continue(end_val115, step_val115); hv_Index += step_val115)
 {
 hv_CurrentColor = ((const HTuple&)hv_Color)[hv_Index%(hv_Color.TupleLength())];
 if (0 != (HTuple(hv_CurrentColor!=HTuple("")).TupleAnd(hv_CurrentColor!=HTuple("auto"))))
 {
 SetColor(hv_WindowHandle, hv_CurrentColor);
 }
 else
 {
 SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);
 }
 hv_Row = hv_R1+(hv_MaxHeight*hv_Index);
 SetTposition(hv_WindowHandle, hv_Row, hv_C1);
 WriteString(hv_WindowHandle, HTuple(hv_String[hv_Index]));
 }
 }
 //Reset changed window settings
 SetRgb(hv_WindowHandle, hv_Red, hv_Green, hv_Blue);
 SetPart(hv_WindowHandle, hv_Row1Part, hv_Column1Part, hv_Row2Part, hv_Column2Part);
 return;
}
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

第三步:在对话框的初始化函数中  对图片控件初始化
BOOL CGszCcdDialog::OnInitDialog()


××××××××××××××××××××××××××××××××
××添加完效果如下


BOOL CGszCcdDialog::OnInitDialog()
{
 CDialogEx::OnInitDialog();


 // TODO:  在此添加额外的初始化
 //picture 控件初始化
 //第一步:实例化一个矩形对象
 CRect temRect;
 //第二步:获得图片控件的矩形区域。
 GetDlgItem(IDC_STATIC_GSZCCD)->GetClientRect(&temRect);
 //把picture控件和halcon关联 ,返回显示图形的窗口句柄
  
 //OpenWindows是HALCON的函数 此处完全是调用


 OpenWindow(0,0,temRect.Width(),temRect.Height(),// 前四个参数是窗口左上角和右下角的坐标。
 (Hlong)(GetDlgItem(IDC_STATIC_GSZCCD)->GetSafeHwnd()),////获得picture控件的窗口句柄后,要强制转化为Hlong型数据
 "visible","",&hv_WindowHandle);


 SetDraw(hv_WindowHandle,"margin");
 SetColored(hv_WindowHandle,12);
 SetLineWidth(hv_WindowHandle,2);


 //设置halcon内部处理的宽度和高度
 SetSystem("tsp_width",3000);
 SetSystem("tsp_height",3000);
 return TRUE;  // return TRUE unless you set the focus to a control
 // 异常: OCX 属性页应返回 FALSE
}
wenluderen
论坛版主
论坛版主
  • 最后登录2018-08-13
  • 发帖数313
  • 金币5557枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
板凳#
发布于:2015-01-31 15:47
第四步:在对话框里面添加一个按钮。并且修改属性
Caption:点我就执行
ID:IDC_BUTTON_GSZCCD


××然后添加按钮的 点击响应函数。

void CGszCcdDialog::OnBnClickedButtonGszccd()
{
 // TODO: 在此添加控件通知处理程序代码


  HTuple Width,Height;
 //SetWindowAttr("background_color","black");
  // HDevWindowStack::Push(hv_WindowHandle);
   ReadImage(&ho_Image, "E:/SCADA整体/SCADA架构之CCD/条码读取专题/二维码专题/二维码素材网盘/222.jpg");
   GetImageSize(ho_Image,&Width,&Height);
   SetPart(hv_WindowHandle,0,0,Height-1,Width-1);
    DispObj(ho_Image,hv_WindowHandle);
    Rgb1ToGray(ho_Image, &ho_GrayImage);
  //*第一步:创建模板*****************************************************************************
  //初学者创建模板时建议选择使用默认参数集(参数集,是多个参数构成的集合):'default_parameters'
  //default_parameters有3种识别模式(识别模式越强,适应场合越广,适应能力和识别能力越强,但耗时越多):
  //standard_recognition  标准模式
  //enhanced_recognition  加强模式
  //maximum_recognition   最强模式
  //建议初学者选用 'maximum_recognition'
  //参数一:输入你要读取的二维码的码制
  //参数二:通用参数可以调整为二维码数据模型的名称。
  //参数三:通用参数可以调整为二维码数据模型的价值。
  //参数四:返回二维码模板句柄


  CreateDataCode2dModel("QR Code", "default_parameters", "maximum_recognition", &hv_DataCodeHandle);
  //*第二步:使用模板
  FindDataCode2d(ho_GrayImage, &ho_SymbolXLDs, hv_DataCodeHandle, "train", "all",
      &hv_ResultHandles, &hv_DecodedDataStrings);


  //参数依次是
  //参数一:输入的图像
  //参数二:XLD轮廓包围成功解码后的数据代码符号。 就是如果找到二维码所在的区域 ,
  //就将那个区域的XLD返回,注意可能输组
  //参数三:所使用的模板句柄
  //参数四:查找模式。  默认是空的 就是说直接找,找不到拉倒。 如果是train,就是一面找一面调整模板参数。
  //参数五:可选的泛型参数的值。
  //参数六:所有成功解码二维码数据符号的句柄。为啥是句柄呢?  如果解码的数据可能很多了。
  //参数七:返回图像中的所有检测到的二维码的数据符号的译码数据串。
  //*第三步: 释放模板
  ClearDataCode2dModel(hv_DataCodeHandle);
 
  //*将读取的数据显示出来
  disp_message(hv_WindowHandle, "读取到数据是:"+hv_DecodedDataStrings, "window", 12, 12, "black",
      "true");
}

图片:2015-01-31_154917.jpg

wenluderen
论坛版主
论坛版主
  • 最后登录2018-08-13
  • 发帖数313
  • 金币5557枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2015-01-31 15:56
PS:几条重要的声明


一:源代码和素材如下:
本部分内容设定了隐藏,需要回复后才能看到


二:源代码在运行前需要 修改的是 二维码图片的路径,注意 HALCON路径和操作系统的路径是不一样。
斜杠的方向不一样。
三:系统的框架程序是开源的, 如果哪位老大愿意加入开发请联系我:wenluderen@gmai.com
四:程序中还有细节 以后会慢慢解释。。
x8515618
工程师
工程师
  • 最后登录2018-08-14
  • 发帖数111
  • 金币853枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
4楼#
发布于:2015-01-31 16:47
大哥你真厉害,这个学习的赶紧太让我们佩服了
gggggbbbbb10
技术员
技术员
  • 最后登录2018-06-26
  • 发帖数41
  • 金币120枚
  • 贡献勋章0枚
5楼#
发布于:2015-02-01 08:17
学习了,谢谢楼主分享
zjpsxf
工程师
工程师
  • 最后登录2017-07-10
  • 发帖数55
  • 金币680枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
6楼#
发布于:2015-02-01 08:43
看来mfc得加紧步伐学习了
smallwhite
工程师
工程师
  • 最后登录2017-11-14
  • 发帖数50
  • 金币703枚
  • 贡献勋章0枚
  • 社区居民
7楼#
发布于:2015-02-02 08:37
很好的学习资料,也试试用mfc来实现~谢谢楼主
nian16
高级工程师
高级工程师
  • 最后登录2018-06-04
  • 发帖数159
  • 金币1949枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
8楼#
发布于:2015-02-02 09:03
学习了,谢谢楼主分享
hcec
初学者
初学者
  • 最后登录2018-08-14
  • 发帖数25
  • 金币88枚
  • 贡献勋章0枚
  • 社区居民
9楼#
发布于:2015-02-02 09:57
学习了,谢谢楼主分享
oneatree
初学者
初学者
  • 最后登录2017-06-18
  • 发帖数17
  • 金币72枚
  • 贡献勋章0枚
  • 社区居民
10楼#
发布于:2015-02-02 11:35
学习了,谢谢楼主分享
pureforce
专家
专家
  • 最后登录2018-03-28
  • 发帖数203
  • 金币3242枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
11楼#
发布于:2015-02-02 13:04
很好的架构,可以当参考学习资料!虽然开发平台不一定相同但架构的差异性不大。
stonenb
专家
专家
  • 最后登录2018-08-14
  • 发帖数158
  • 金币2620枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
12楼#
发布于:2015-02-03 08:45
厉害,学习了。。谢谢
Jeehly_Lee
助理工程师
助理工程师
  • 最后登录2018-07-25
  • 发帖数33
  • 金币211枚
  • 贡献勋章0枚
  • 社区居民
13楼#
发布于:2015-02-03 17:39
wenluderen:PS:几条重要的声明


一:源代码和素材如下:


二:源代码在运行前需要 修改的是 二维码图片的路径,注意 HALCON路径和操作系统的路径是不一样。
斜杠的方向不一样。
三:系统的框架程序是开源的, 如果哪位老大愿意加...
回到原帖
喜欢
jon_liu
高级工程师
高级工程师
  • 最后登录2018-01-08
  • 发帖数191
  • 金币1347枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
14楼#
发布于:2015-02-12 10:50
学习一下!!!!!!!!!!!1
上一页
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服