明显是没有拆分好,gen_iamge3是需要三个指针的,你得先把B,G,R三个通道的数组首地址求出来(注意,图像一般的B,G,R模式排列,而且是左下角为原点,需要自己转化)
建议用gen_image_interleaved( : ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow, StartColumn, BitsPerChannel, BitShift : )
ocr文字识别软件,可以根据识别文字。但是,必须要提醒你,图形识别已经属于一定的人工智能范畴,目前的软件技术还没达到应对各种状况的程度,所以前期的工作你要做好,比如文字越清晰却容易识别,上颜色越少越容易识别,文字与背景色对比越明显越容易识别,文字书写越规范越容易识别,英文和数字比中文更容易识别等等。可以使用ABBYY FineReader这款老牌OCR识别软件,个人认为识别率蛮高的,提供软件下载网页链接你试下,看看能不能行
在HALCON/NET,我们可以用过一个类的实例
(instances of class)来调用HALCON算子。在HalconDotNet引用里,也就是动态链接库里包许多实例化一个类方法,这些
方法可能是重载的,静态的HALCON算子我们可以直接通过类名来调用(这些方法包括HALCON里所有的算子),而非静态的方法必须要通过实例化一个类
后才可以使用,通常HALCON/NET封装了一个类的实例化方法以及类方法。
例如在C++中,可以使用以下两种方法:
1 C++(算子模式)
通过代码导出,以C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要用Hobject、HTuple两类类型进行声明;
2 C++(面向对象)
可以以面向对象的方式重写代码,也即利用类及类的成员函数;在这种模式下,控制变量的类型仍未HTuple,而图形数据可以由多种类型,如HImage等;
HALCON手册建议使用者使用第二种方法。
例如我们使用第二种方法实现抓取图像序列(imagesequence)里第一张图像,并且将他显示在HWindowControl窗口中。代码是:
[cpp] view plaincopy
private HWindow Window;
private HFramegrabber Framegrabber;
private HImage Img;
Window= WindowControlHalconWindow;
Framegrabber= new HFramegrabber("File", 1, 1, 0, 0, 0, 0, "default",
-1,"default", -1, "default",
"board/boardseq","default", 1, -1);
Img= FramegrabberGrabImage();
ImgDispObj(Window);
GrabImage算子是通过HFramegrabber的实例来调用的。如果你是一个有经验的HALCON使用者,也许你已经看出来HFramegrabber的构造函数调用了OpenFramegraber算子。
但是对于新手来说,可能刚刚接触Halcon,对于Halcon算子还处于熟悉阶段,从Hdevelop中直接到出来的代码也是直接使用静态类。那么建议先使用第一种方法,你只需要明白通过HOperatorSet这个类你可以调用任何一个HALCON算子。
下面我们来看一下到底怎么样调用一个算子。以GrabImage算子为例:
[cpp] view plaincopy
static void HOperatorSetGrabImage (out HObject image, HTuple acqHandle)//静态方法直接调用算子,包含的参数和halcon算子参数完全相同
void HImageGrabImage (HFramegrabber acqHandle)//类中封装的类方法,要先实例化类后才可以使用
HImage HFramegrabberGrabImage ()//重载的方法
image(output_object) image ; HImage
acqHandle(input_control) framegrabber ; HFramegrabber / HTuple
[cpp] view plaincopy
我们可以看出,算子可以通过三个类进行调
用:HOperatorSet, HImage,和HFramegrabber。其中第一种通过HOperatorSet调用主要是用在导出的
HDevelop中(如果你导出程序的话就会看到),也是建议新手使用的方法。而熟悉了之后一般我们在写程序时建议使用另外两种方式,就像下面这样进行调
用:
[cpp] view plaincopy
HImage Image1;
HImage Image4 = newHImage();
HFramegrabberFramegrabber =
newHFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1,
"default",-1, "default", "board/boardseq", "default", -1,-1);
Image1 =FramegrabberGrabImage();
HImage Image3 = null;
需要注意的是通过
HFramegrabber调用返回方法的值,而通过HImage调用没有返回值而是调用的类实例被修改,也就是HImage对象被修改。通常,调用类实
例不会被一个算子所修改,除了被上面所看到的“类构造器”(constructor-like)算子调用。
一些算子像CountSeconds可以当做类方法来使用,例如,你可以直接通过类名调用它们而不用生成一个实例:
[cpp] view plaincopy
double S1, S2;
S1 =HSystemCountSeconds();
这是因为这些算子声明前面都有static关键字:
[cpp] view plaincopy
static void HOperatorSetCountSeconds (outHTupleseconds)
static double HSystemCountSeconds()<span style="font-family:'Times New Roman'; font-size:14px; line-height:21px"> </span>
下面我们看一下类的生命周期:从声明(Declaration)到终结(Finalization)
下面的声明仅仅声明了一个类HImage的变量,而没有指向任何的对象:
[cpp] view plaincopy
HImage Image1;
在这个语句中,你不能只使用变量直接去调用算子;有些语言里面甚至不能够将它用做一个输出参数(例如VB 2005)。只有先给它一个图像对象,例如:
[cpp] view plaincopy
Image1 =FramegrabberGrabImage();
你也可以在声明的时候初始化一个变量:
[cpp] view plaincopy
HImage Image2 =FramegrabberGrabImage();
[cpp] view plaincopy
<span style="font-family:Arial,Helvetica,sans-serif"></span><pre name="code" class="cpp">HImage Image3 = null;</pre>
你可以通过一个IsInitialized方法来检验一个类实例是否被初始化。
但是使用构造函数(Constructors)后的对象就可以了:
下面的式子是利用类HImage空的构造函数来初始化一个类变量
[cpp] view plaincopy
HImage Image4 = new HImage(); <span style="font-family:'Times New Roman'; font-size:14px"> </span>
类实例可以用来调用“类似构造函数”算子像GrabImage,用抓住的一张初始化类变量:
[cpp] view plaincopy
Image4GrabImage(Framegrabber);
除了空的构造器,大部分HALCON/NET类提供一个或者更多的构造器来初始化基于HALCON算子的对象。例如,HImage提供了一个构造器:
[cpp] view plaincopy
HImage Image5 = newHImage("fuse");<span style="font-family:'Times New Roman'; font-size:14px; line-height:21px"> </span>
reference manual和右键go to definition是很好的参考资料。
关于Finalizers
在NET中程序员不需要考虑内存管理方面的事情,因为它有自动垃圾回收回收哪些不再使用的对象。HALCON/NET完全遵循这种规则通过提供所有类的回收器,所以不需要管理资源,例如,一个图像采集设备的连接会被自动正确的删除。
对于大部分类,回收器自动调用合适的算子像CloseFramegrabber来释放资源。调用的算子在一个参考手册页中列了出来(例如HFramegrabber)。这个算子不可以通过类来调用,在相应的参考手册条目中可以看到:
[cpp] view plaincopy
static void HOperatorSetCloseFramegrabber (HTupleacqHandle)
也就是说你没有必要调用这样一个算子,如果你想用别的参数从新进行连接,它会自动执行。
注意当用HFramegrabber一般的类时不能使用HOperatorSet来关闭或者清除算子。
但是对于像图像这种数据变量,它们包含的只是引用,对于他们指向的内存垃圾回收机制也许不会直接清除,这些就需要手动清除:
有一种方法是在处理完事件后直接调用GC清除:
[cpp] view plaincopy
private void Timer_Tick(object sender, SystemEventArgs e)
{
Action();
GCCollect();
GCWaitForPendingFinalizers();
}
另一种方法是直接调用自带的销毁方法:
[cpp] view plaincopy
HImage Image = new HImage("fuse");
ImageDispose();
前面总结了利用HALCON进行模板匹配的一些方法,讨论了利用物体形状的轮廓进行匹配的步骤和如何来优化匹配的速度,提高匹配的精度和速度,当然这两者之间本身也存在着制约,而在这两者之间找到一个适合自己要求的结合点,正是我们要研究和实验的。模板匹配并不是单纯的一个任务,它是一些其他工作的一个必备环节,比如物体识别、对象跟踪、检验产品、零件统计等等一些机器视觉应用。在很多情况下,模板匹配是个不错的选择。在前面总结模板匹配方法的基础上,利用HALCON做了一些视频对象跟踪的实验,并多次试验来调整程序参数优化跟踪过程,采用标准视频进行测试,将这些方法作了如下总结。
首先来看看HALOCN中的帧采集器(FrameGrabber),HDevelop提供这样一个函数来开启你采用的帧采集器(这里我的理解就是图像采集卡或工业摄像机)open_framegrabber(),这个函数中指定了HALCON目前支持的一些帧采集器的文件参数,主要有'BARRACUDA', 'BaumerFCAM', 'BCAM1394', 'BitFlow', 'DahengCAM', 'DahengFG', 'DFG-BW', 'DFG-LC', 'DirectFile', 'DirectShow', 'DT315x', 'DT3162', 'File', 'FireGrab', 'FirePackage', 'FlashBus', 'FlashBusMX', 'Ginga++', 'GingaDG', 'IDS', 'INSPECTA', 'Leutron', 'MatrixVision', 'MeteorII', 'mEnable3', 'MultiCam', 'Opteon', 'p3i2', 'p3i4', 'PT1000CL', 'PX', 'PXC', 'PXD', 'PXR', 'SaperaLT', 'TAG', 'TWAIN', 'uEye';除此之外,在官方网站上也在逐步推出新支持的一些采集卡,比如近期推出的支持大恒的DahengCAM的USB20接口(更多的信息请访问>
以上就是关于HALCON如何获取视频的图像全部的内容,包括:HALCON如何获取视频的图像、关于halcon ocr识别数字、怎样使用HALCON/.NET类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)