kc紫皇
专家
专家
  • 最后登录2016-07-24
  • 发帖数184
  • 金币4510枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:16774回复:244

MFC/HALCON混合编程系列八_使用Halcon技巧

楼主#
更多 发布于:2014-03-07 23:36
下面是examples中用的到的技巧:

图片:QQ截图20140307233050.png

本部分内容设定了隐藏,需要回复后才能看到


1、添加左键点击的等待,这样可以在调试的时候有时间观察结果

void click(const Halcon::HWindow &w)
   
{
   
  cout << "Click with mouse button to continue ..."; cout.flush();
   
  w.Click();
   
  cout << " ok\n"; cout.flush();
   
}



2、线性改变图片方法

double     t1,t2;
   
in.Display(w);
   
HByteImage out = in;
   
int  width  = out.Width();
   
int  height = out.Height();
   
long end    = width * height;
   
cout << "- copy image bit by bit via linear bit access" << endl;
   
count_seconds(&t1);
   
for (int k = 0; k < end; k++)
   
    out[k] = 255 - in[k];
   
count_seconds(&t2);
   
cout << "  --> (linear) time = " << (t2-t1)*1000 << " msec" << endl;
   
out.Display(w);
   
click(w);



3、非线性操作图片

count_seconds(&t1);
   
 for (int y=0; y<height; y++)
   
   for (int x=0; x<width; x++)
   
     out(x,y) = 255 - out(x,y);
   
   
   
 count_seconds(&t2);



4 、region的膨胀

HByteImage g("monkey");
   
HWindow    w(0,0,g.Width(),g.Height());
   
w.SetPart(0,0,g.Height()-1,g.Width()-1);
   
HRegion    reg = g >= 128;            // threshold
   
w.SetColor("yellow");
   
w.SetInsert("xor");
   
reg.Display(w);
   
for (int i=0; i<100; i++)
   
    (++reg).Display(w);                 // stepwise dilation of region



5 、利用&操作制造圆形ROI

void RegionOfInterest()
   
{
   
  using namespace Halcon;
   
    
   
  cout << endl << "Restriction of the definition range" << endl;
   
    
   
  HByteImage image("mreut");
   
  HWindow    w(0,0,image.Width(),image.Height());
   
  w.SetPart(0,0,image.Height()-1,image.Width()-1);
   
  int        i;
   
    
   
  for (i=1; i<30; i += 1)
   
    (image & HRegion::GenCircle(255,255,i)).Display(w);
   
  for (; i<80; i += 2)
   
    (image & HRegion::GenCircle(255,255,i)).Display(w);
   
  for (; i<255; i += 4)
   
    (image & HRegion::GenCircle(255,255,i)).Display(w);
   
    
   
  click(w);
   
}



6、 图像的移动,局部增值

void Move(int x, int y)
   
{
   
  using namespace Halcon;
   
    
   
  cout << endl << "Move image with offset x=" << x << " and y=" << y << endl;
   
    
   
  HByteImage in("mreut");
   
  HWindow    w(0,0,in.Width(),in.Height());
   
  w.SetPart(0,0,in.Height()-1,in.Width()-1);
   
  in.Display(w);
   
    
   
  HByteImage out = in;
   
    
   
  for (HImageIterator it(in,-x,-y,x,y); it.Continue(); ++it)
   
    out[it] = in[it(x,y)];
   
//这里是图片的每一个像素点都进行移动
   
  out.Display(w);
   
  click(w);
   
}
   
    
   
void Add(int val)
   
{
   
  using namespace Halcon;
   
    
   
  cout << endl << "Add gray value " << val << " to inner image part" << endl;
   
    
   
  HByteImage in("mreut");
   
  HWindow    w(0,0,in.Width(),in.Height());
   
  w.SetPart(0,0,in.Height()-1,in.Width()-1);
   
  in.Display(w);
   
    
   
  HByteImage out = in;
   
  HCircle    circle(HDPoint2D(256,256),200);
   
    
   
  for (HImageIterator it(in,HRegion(circle)); it.Continue(); ++it)
   
    out[it] = HClipByte(in[it] + val);
   
//这里图片中相应的圆的范围增加相应的val值
   
  out.Display(w);
   
  click(w);
   
}



7 、自定义模板滤波,这里是sobel纵向

void SobelY()
   
{
   
  using namespace Halcon;
   
    
   
  cout << endl << "Apply simple sobel filter in Y-direction" << endl;
   
    
   
  HByteImage in("mreut");
   
  HWindow    w(0,0,in.Width(),in.Height());
   
  w.SetPart(0,0,in.Height()-1,in.Width()-1);
   
  in.Display(w);
   
  HByteImage out = in;
   
    
   
  for (HImageIterator it(in,3,3); it.Continue(); ++it)
   
  {
   
    int val = -2 * (int)in[it(-1,-1)] -
   
          (int)in[it(0,-1)] -
   
      2 * (int)in[it(1,-1)] +
   
      2 * (int)in[it(-1,1)] +
   
          (int)in[it(0,1)] +
   
      2 * (int)in[it(1,1)];
   
    out[it] = HClipByte(HAbs((long)val));
   
  }
   
    
   
  out.Display(w);
   
  click(w);
   
}



Note:除了clickw)来等待点击,另一种方法是直接使用w.Click()
8 、watersheds的使用

HByteImage gauss   = image.GaussImage(9);
   
HByteImage invert  = gauss.InvertImage();
   
HRegion    sheds;
   
  cout << endl << "Starting watersheds algorithm." << endl;
   
  cout << "Attention: Dependent on your hardware this may take some time!" << endl;
   
HRegionArray cells = invert.Watersheds(&sheds);
   
cout << cells.Num() << " cells found!" << endl << endl;



9、 直方图的建立和数据的保存
enum { MAX_WIDTH = 1300, ADD = 10 };
// Building distribution:
int  histo[MAX_WIDTH+2*ADD];
int  i;
for (i=0; i<MAX_WIDTH+2*ADD; i++)
histo[i] = 0;  //初始化
 
  for (i=0; i<cells.Num(); i++)                    //这里的cells是8中的结果
    for (int k=-ADD; k<=ADD; k++)           //从-Add到Add的数据统计为一组
      histo[(int)(cells[i].X())+k+ADD]++;     //直方图的赋值,这里的X()得到的是第i个------------------------------------------------region的中心点的行坐标,那么直方图中向右------------------------------偏移ADD个单位(为了不从小于0的位置开始)所在的一个宽度------------------------------为2*ADD的柱状图(高度+1) 
  // Writing distribution into file:
 
  ofstream out("cells.dat");
  for (i=0; i<MAX_WIDTH+2*ADD; i++)
    out << i-ADD << " " << histo[i] << endl;
 
  cout << "Distribution of cell sizes saved in file 'cells.dat'." << endl;
  cout << endl;
 
  cout << "Click with mouse button to continue ..." << endl;
  w.Click();
 
  cout << "The End." << endl;
note: 这里每行的region个数被统计,并且以一个宽度为2*ADD的柱状图来表示个数


10 、部分显示图片以及鼠标点击的操作
cout << "- Display image" << endl;
 
  Mandrill.Display(w);
 
  
 
  cout << "- Display image parts" << endl;
 
  w.SetPart (  0,100,312,412);      Mandrill.Display (w);
 
  w.SetPart ( 50,150,262,362);      Mandrill.Display (w);
 
  w.SetPart (100,200,212,312);      Mandrill.Display (w);
 
  w.SetPart (150,250,162,262);      Mandrill.Display (w);
 
  w.SetPart (155,255,157,257);      Mandrill.Display (w);
 
  w.SetPart (  0,  0,511,511);      Mandrill.Display (w);
 
  
 
@鼠标点击事件
 
cout << "Press left, middle, or right mouse button!" << endl;
 
  (void)w.GetMbutton(NULL,&Button);
 
  
 
  switch (Button[0].I()) {
 
    case 1:
 
      cout << "-> Left button pressed." << endl;
 
      break;
 
    case 2:
 
      cout << "-> Middle button pressed." << endl;
 
      break;
 
    case 4:
 
      cout << "-> Right button pressed." << endl;
 
      break;
 
    default:
 
      cout << "-> Multiple buttons pressed." << endl;
 
      break;
 
  }
d5121226
技术员
技术员
  • 最后登录2016-10-31
  • 发帖数10
  • 金币154枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
沙发#
发布于:2014-03-08 08:57
学习一下,多谢分享~~
chxy10086
工程师
工程师
  • 最后登录2016-09-16
  • 发帖数29
  • 金币941枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
板凳#
发布于:2014-03-08 09:54
顶顶,学习中~~~~
xiangbing17
助理工程师
助理工程师
  • 最后登录2016-12-30
  • 发帖数44
  • 金币327枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
地板#
发布于:2014-03-08 11:05
学习了,看起来 高端大气上档次
danruochenxi
工程师
工程师
  • 最后登录2016-08-20
  • 发帖数138
  • 金币799枚
  • 贡献勋章0枚
  • 社区居民
4楼#
发布于:2014-03-08 11:49
赞一个,顺便学习一下!
qqwty123
专家
专家
  • 最后登录2017-01-17
  • 发帖数190
  • 金币2212枚
  • 贡献勋章1枚
  • 社区居民
  • 忠实会员
5楼#
发布于:2014-03-08 12:12
赞一个,喜欢了,留待学习
lyjclsd
技术员
技术员
  • 最后登录2017-01-13
  • 发帖数29
  • 金币194枚
  • 贡献勋章0枚
  • 社区居民
6楼#
发布于:2014-03-08 14:14
学习一下,看看是些什么东西
shou40101
工程师
工程师
  • 最后登录2016-04-23
  • 发帖数13
  • 金币902枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
7楼#
发布于:2014-03-08 19:13
赞一个,喜欢了,留待学习
lym200725
助理工程师
助理工程师
  • 最后登录2014-06-04
  • 发帖数97
  • 金币583枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
8楼#
发布于:2014-03-10 21:06
真是不错哟,呵呵,顶一下
mjmtofu
技术员
技术员
  • 最后登录2016-06-19
  • 发帖数7
  • 金币120枚
  • 贡献勋章0枚
  • 社区居民
9楼#
发布于:2014-03-10 23:10
非常感谢楼主经验的分享!
守望者maque
助理工程师
助理工程师
  • 最后登录2016-08-02
  • 发帖数40
  • 金币599枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
10楼#
发布于:2014-03-11 10:00
挺不错的东西,学习中…………
liaosy666
技术员
技术员
  • 最后登录2014-09-12
  • 发帖数43
  • 金币146枚
  • 贡献勋章0枚
  • 社区居民
11楼#
发布于:2014-03-12 08:47
O(∩_∩)O谢谢O(∩_∩)O谢谢O(∩_∩)O谢谢
georgepan
技术员
技术员
  • 最后登录2017-01-16
  • 发帖数17
  • 金币101枚
  • 贡献勋章0枚
  • 社区居民
12楼#
发布于:2014-03-12 09:28
搞不懂这么好的东西 整么没什么人气
barretq
技术员
技术员
  • 最后登录2017-01-12
  • 发帖数33
  • 金币185枚
  • 贡献勋章0枚
13楼#
发布于:2014-03-12 10:36
学习一下,需要这方面的东西。
lalala_82
初学者
初学者
  • 最后登录2016-06-06
  • 发帖数6
  • 金币37枚
  • 贡献勋章0枚
  • 社区居民
14楼#
发布于:2014-03-13 12:54
赞一个,mark一下留着学习~!
上一页
游客

返回顶部