HALCON学习笔记之MFC调用笔记本摄像头 5

MFC工程增加视频图像采集线程

VC连接各类摄像设备皆可参考:

头文件(定义需要的变量):

public:

CString m_value;
//定义窗口句柄变量
HTuple  WindowHandle;
//创建一个窗口
void	CreateImageWindow();
//用来循环执行的一个变量
bool    StartImageState;  
//函数名(线层对应的函数)
static  UINT StartCameraTest(LPVOID pParam);  

//按键
afx_msg void OnStnClickedVideowindowStatic();  
afx_msg void OnPlayvideoButton();
afx_msg void OnBnClickedStarttestButton();
afx_msg void OnExit();
afx_msg void OnEnChangeEdit2();
afx_msg void OnBnClickedOk();

//HALCON导入的一个变量
HObject  ho_Image;
Dialog界面:

在这里插入图片描述

源文件:
首先在BOOL CMFCApplication1Dlg::OnInitDialog()函数中声明一些信息
m_value = "HelloWorld";
UpdateData(false);
CreateImageWindow();

void CMFCApplication1Dlg::OnExit()
{
//AfxGetMainWnd()->SendMessage(WM_CLOSE);  //与下面功能相同,取一个
StartImageState = false;
exit(0);//正常终止程序

}

void CMFCApplication1Dlg::OnPlayvideoButton()
{
//               线层对应函数   传给线层的参数    优先级        堆栈大小  创建标记   安全属性
AfxBeginThread(StartCameraTest, this,         THREAD_PRIORITY_NORMAL, 0,     0,        NULL);  //开启一个线程
}

void  CMFCApplication1Dlg::CreateImageWindow()//创建一个窗口 注意类名和本文件匹配
{
CRect   Picturebox_Region;
HTuple  hv_Exception;

//IDC_VideoWindow_STATIC为Dialog创建的picture control
GetDlgItem(IDC_VideoWindow_STATIC)->GetClientRect(&Picturebox_Region);
HWND hPicturebox_Region = GetDlgItem(IDC_VideoWindow_STATIC)->m_hWnd;
HTuple Row = (HTuple)Picturebox_Region.top;
HTuple Column = (HTuple)Picturebox_Region.left;
HTuple Width = (HTuple)Picturebox_Region.Width();
HTuple Height = (HTuple)Picturebox_Region.Height();
try
{
	SetWindowAttr("background_color", "red");
	OpenWindow(Row, Column, Width, Height, (Hlong)hPicturebox_Region, "visible", "", &WindowHandle);
}
catch (HalconCpp::HException &HDevExpDefaultException)
{
	HDevExpDefaultException.ToHTuple(&hv_Exception);
	throw HalconCpp::HException(hv_Exception);
}
}

UINT CMFCApplication1Dlg::StartCameraTest(LPVOID pParam)    //对头文件定义函数进行具体实现

{
//函数参数,强制转换为指向类对象的指针
	CMFCApplication1Dlg *pDlg = (CMFCApplication1Dlg*)pParam; 
//相机句柄
	HTuple  hv_AcqHandle;  

//打开相机
	OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", 
	"default", "[0] Integrated Camera", 0, -1, &hv_AcqHandle);
//开始图像采集
	GrabImageStart(hv_AcqHandle, -1);  
 //让连续执行whlie(1)  可以在退出按钮设置=false
	pDlg->StartImageState = true;
	while (pDlg->StartImageState)
	{
		GrabImageAsync(&pDlg->ho_Image, hv_AcqHandle, -1);
		HTuple hv_Width, hv_Height; //定义变量
		GetImageSize(pDlg->ho_Image, &hv_Width, &hv_Height);//获取图像宽高
	//通过改变图像的缩放来适应图像在窗口的正常显示    显示多大图像
		SetPart(pDlg->WindowHandle, 0, 0, hv_Height, hv_Width);
	//            窗口句柄  左上角行坐标 左上角列坐标  右上角行坐标 右上角列坐标 
	
	//在窗口上显示图像
		DispObj(pDlg->ho_Image, pDlg->WindowHandle);
	}
	CloseFramegrabber(hv_AcqHandle);  //关闭
	AfxEndThread(0); // 结束线程
	return 0;
}
结果:

在这里插入图片描述

过程:
1️⃣在HALCON中先调用相机然后到处C++代码;
2️⃣在action函数中根据需要添加到工程中。

补充知识

当需要取得 Dialog 上之控制项储存资料时 使用 UpdateData(TRUE) 来取得

反之 需要将资料数据呈现在 Dialog 之时 需要用 UpdateData(FALSE)

生成MFC时会产生如下代码
void CDDXDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT, num);
DDV_MinMaxInt(pDX, num, 1, 20);
}
其中 DDX_ 代表 -> Do Data Exchange

DDV_ 代表了 -> Do Data Verification

所以执行 UpdateData(TRUE) 就代表了 IDC_EDIT -> num 的资料交换

而 UpdateData(FALSE) 即代表了 num -> IDC_EDIT 的资料交换

且執行 UpdateData() 类似 DDV_MinMaxInt 的资料基本检查

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值