要将 OpenCV 中的帧(Frame)播放出来,可以使用 MFC(Microsoft Foundation Class)和 GDI+(Graphics Device Interface Plus)库来完成。下面是一个示例代码:
#include <opencv2/opencv.hpp>
#include <afxwin.h>
void DisplayFrame(cv::Mat frame) {
// 将 OpenCV 的帧转换为 GDI+ 的位图格式
cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);
CImage image;
image.Create(frame.cols, frame.rows, 24); // 创建位图对象
memcpy(image.GetBits(), (uchar*)frame.data, frame.cols * frame.rows * 3); // 复制像素数据
// 在 MFC 窗口中绘制图像
CWnd* pWnd = AfxGetMainWnd();
CDC* pDC = pWnd->GetDC();
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, frame.cols, frame.rows);
CBitmap* oldbmp = dc.SelectObject(&bmp);
dc.BitBlt(0, 0, frame.cols, frame.rows, NULL, 0, 0, WHITENESS);
Graphics graphics(dc.GetSafeHdc());
// 绘制位图
graphics.DrawImage((Gdiplus::Bitmap*)&image,
Gdiplus::Rect(0, 0,image.GetWidth(), image.GetHeight()),
0,
0,
image.GetWidth(),
image.GetHeight(),
Gdiplus::UnitPixel);
// 更新显示
pDC->BitBlt(0, 0,
frame.cols,
frame.rows,
&dc,
0,
0,
SRCCOPY);
// 清理内存
dc.SelectObject(oldbmp);
ReleaseDC(pDC);
}
int main() {
cv::VideoCapture cap(0); // 打开摄像头,参数可为视频文件路径或设备编号
if (!cap.isOpened()) {
return -1;
}
cv::Mat frame;
while (true) {
cap.read(frame); // 读取摄像头的帧
if (frame.empty()) {
break;
}
DisplayFrame(frame); // 显示帧
if (cv::waitKey(1) == 'q') { // 按下 'q' 键退出循环
break;
}
}
cap.release(); // 关闭摄像头
cv::destroyAllWindows(); // 关闭窗口
return 0;
}
以上代码使用 OpenCV 的 VideoCapture 类来获取摄像头的帧,然后将每一帧转换为 GDI+ 的位图格式,并利用 MFC 在窗口中绘制并显示。请注意,此代码只是一个简单示例,你可能需要根据自己的需求进行适当的修改和调整。
内容由零声教学AI助手提供,问题来源于学员提问