aardio调用halcon采集摄像头
By
admin
at 2018-05-08 • 0人收藏 • 2553人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=969;bottom=646;parent=...)
winform.add(
button={cls="button";text="开启";left=31;top=549;right=193;bottom=635;z=1};
button2={cls="button";text="关闭";left=208;top=549;right=370;bottom=635;z=2};
picturebox={cls="picturebox";left=0;top=0;right=970;bottom=535;z=3}
)
/*}}*/
import com;
var HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}")
import console
console.open()
var AcqHandle = HOperatorSetX.OpenFramegrabber( 'DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '', 0, -1 );
HOperatorSetX.GrabImageStart( AcqHandle , -1 );
var Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 );
//获取图像宽和高
var Width , Height = HOperatorSetX.GetImageSize( Image );
console.log(Width , Height)
//调整画面大小和图像一致
var WindowHandle = HOperatorSetX.OpenWindow( 0 , 0 , Width , Height , winform.picturebox.hwnd , "transparent","" );
var videoShow = true;
winform.button.oncommand = function(id,event){
while(win.delay(30)&&videoShow){
Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 );
//镜像图像
var ImageMirror = HOperatorSetX.MirrorImage( Image , "row" );
HOperatorSetX.DispObj( ImageMirror , WindowHandle );
//释放内存
HOperatorSetX.ClearObj( ImageMirror );
HOperatorSetX.ClearObj( Image );
}
}
winform.button2.oncommand = function(id,event){
videoShow = false;
win.delay(500)
HOperatorSetX.CloseFramegrabber( AcqHandle );
}
winform.wndproc = function(hwnd,message,wParam,lParam){
select( message ) {
case 0x10/*_WM_CLOSE*/{
if(videoShow){
videoShow = false;
win.delay(500)
HOperatorSetX.CloseFramegrabber( AcqHandle );
}
}
else{
}
}
//无返回值则继续调用默认回调函数
}
winform.enableDpiScaling();
winform.show();
win.loopMessage();
return winform;调用halcon的摄像头进行连续处理,记得要释放掉Obj内存,要不然内存会慢慢增加到溢出为止。。。。。。。。
注意:
经过多次测试,发现个问题,开启halcon摄像头必须按照一定的顺序初始化,要不然得出的效果就不是正常的。
开启摄像头显示必须按照下面的格式顺序:
var AcqHandle = HOperatorSetX.OpenFramegrabber( 'DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '', 0, -1 ); HOperatorSetX.GrabImageStart( AcqHandle , -1 ); var Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 ); //调整画面大小和图像一致 var WindowHandle = HOperatorSetX.OpenWindow( 0 , 0 , winform.picturebox.width, winform.picturebox.height , winform.picturebox.hwnd , "transparent","" );
先初始化摄像头,然后开启摄像头,然后获取一帧图像舍弃,再初始化界面中的图像控件。。。
其他的任何顺序都会得不到想要的效果。
1 个回复 | 最后更新于 2018-05-10
登录后方可回帖
如果调用多个摄像头,必须开线程:
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=1348;bottom=646;parent=...) winform.add( button={cls="button";text="开启";left=31;top=549;right=193;bottom=635;z=1}; button2={cls="button";text="关闭";left=208;top=549;right=370;bottom=635;z=2}; button3={cls="button";text="开启";left=766;top=546;right=928;bottom=632;z=5}; button4={cls="button";text="关闭";left=1017;top=546;right=1179;bottom=632;z=6}; picturebox={cls="picturebox";left=0;top=0;right=645;bottom=526;z=3}; picturebox2={cls="picturebox";left=704;top=0;right=1349;bottom=526;z=4} ) /*}}*/ import console console.open() winform.button.oncommand = function(id,event){ thread.set("标志键", true); thread.invoke( function(hwnd){ import com; //import win.ui; var HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}") var AcqHandle = HOperatorSetX.OpenFramegrabber( 'DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0]', 0, -1 ); HOperatorSetX.GrabImageStart( AcqHandle , -1 ); var Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 ); //获取图像宽和高 var Width , Height = HOperatorSetX.GetImageSize( Image ); var WindowHandle = HOperatorSetX.OpenWindow( 0 , 0 , Width , Height , hwnd , "transparent","" ); while(thread.get("标志键")){ var Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 ); //镜像图像 var ImageMirror = HOperatorSetX.MirrorImage( Image , "row" ); HOperatorSetX.DispObj( ImageMirror , WindowHandle ); //释放内存 HOperatorSetX.ClearObj( ImageMirror ); HOperatorSetX.ClearObj( Image ); sleep(30) } sleep(500) HOperatorSetX.CloseFramegrabber( AcqHandle ); },winform.picturebox.hwnd ) } winform.button2.oncommand = function(id,event){ thread.set("标志键", false); } winform.button3.oncommand = function(id,event){ thread.set("标志键1", true); thread.invoke( function(hwnd){ import com; //import win.ui; var HOperatorSetX = com.CreateObject("{6ebd90e2-d219-11d2-ade5-0000c00f4ef9}") var AcqHandle = HOperatorSetX.OpenFramegrabber( 'DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[1]', 0, -1 ); HOperatorSetX.GrabImageStart( AcqHandle , -1 ); var Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 ); //获取图像宽和高 var Width , Height = HOperatorSetX.GetImageSize( Image ); var WindowHandle = HOperatorSetX.OpenWindow( 0 , 0 , Width , Height , hwnd , "transparent","" ); while(thread.get("标志键1")){ var Image = HOperatorSetX.GrabImageAsync( AcqHandle , -1 ); //镜像图像 var ImageMirror = HOperatorSetX.MirrorImage( Image , "row" ); HOperatorSetX.DispObj( ImageMirror , WindowHandle ); //释放内存 HOperatorSetX.ClearObj( ImageMirror ); HOperatorSetX.ClearObj( Image ); sleep(30) } sleep(500) HOperatorSetX.CloseFramegrabber( AcqHandle ); },winform.picturebox2.hwnd ) } winform.button4.oncommand = function(id,event){ thread.set("标志键1", false); } winform.enableDpiScaling(); winform.show(); win.loopMessage(); return winform;