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 的资料基本检查