一、目的:

1、想知道:MFC使用opencv在picture控件上面播放摄像头视频

 

二、参考

1、

 

三、操作

1、MFC中创建picture控件:IDC_camera

 

1、MFC中创建Camera类

①Camera.h

#pragma once

#include "afxwin.h"

#include "Resource.h"

#include "opencv.hpp"
#include  "videoio.hpp"
#include "CvvImage.h"

using namespace std;
using namespace cv;

class Camera
{
public:
	Camera();
	~Camera();

public:
	CWnd *m_pCWnd;//相机:窗口类指针
	HWND m_HWND;//相机:窗口类句柄
	bool m_bIsCanPlay=false;//相机是否能够播放
	VideoCapture m_videoCapture;

public:
	//相机:在picture上面显示相机画面
	void CameraPlayOnPicture();
};

①Camera.cpp

#include "stdafx.h"
#include "Camera.h"


Camera::Camera()
{
	
}


Camera::~Camera()
{
}

void Camera::CameraPlayOnPicture()
{
	//测试:此地方不使用while
	if (m_bIsCanPlay)
	{
		if (!m_videoCapture.isOpened())
		{
			m_videoCapture.open(0);
		};

		Mat frame;
		m_videoCapture >> frame;
		IplImage* pFrame = (IplImage *)&IplImage(frame);					//IplImage* 与Mat 格式相互转换:Mat转换为IplImage
		CDC *pCDC = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_camera)->GetDC();	//获得控件设备上下文指针,IDC_CAMERA为控件的ID
		HDC hDC = pCDC->GetSafeHdc();		 //转换为句柄
		CRect rect;
		AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_camera)->GetClientRect(&rect); //获得控件的位置
		AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_camera)->MoveWindow(0, 0, 1920, 1080);
		CvvImage cimg;
		cimg.CopyOf(pFrame);
		cimg.DrawToHDC(hDC, &rect);						//显示图像

		if (m_pCWnd == NULL)
		{
			m_pCWnd = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_camera);//找到IDC_inVideo控件
		}

		if (m_HWND == NULL)
		{
			m_HWND = m_pCWnd->GetSafeHwnd();//得到窗口指针句柄
		}

		ReleaseDC(m_HWND, hDC);																		 //CDC类在用完后记得释放
	}

}

 

1、MyLiftDlg中创建线程,不断播放监控视频

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐