OpenCV C++ 通过Websocket发送摄像头图片到Web端

OpenCV C++ 通过Websocket发送摄像头图片到Web端,第1张

OpenCV C++ 通过Websocket发送摄像头图片到Web端

文章目录

1. 说明2. 流程3. 代码

3.1 C++端代码

3.1.1 主要逻辑

cv::Mat格式数据转换为jpg格式数据 3.1.2 websocket服务端代码 3.2 Web端代码

index.htmlvideo.js 4. 演示效果5. 代码

1. 说明

现有业务,正在做一个Windows桌面程序,使用C++ 和 Qt 编写硬件调用的硬件接口,用Web端写程序的UI界面。程序中需要做人脸识别,Web端要预览摄像头画面,C++来实现人脸检测与人脸识别。为了使Web端实时预览到摄像头的画面,目前想到了一个方案:C++端打开摄像头抓图,然后发送图片给Web端来显示,Web端展示效果如同视频流一样实时流畅。


2. 流程

C++端: 创建Websocket服务端,使用OpenCV打开摄像头,抓取图片,发送给Web端
Web端:连接Websocket服务端,接收C++端发送过来的图片,显示


3. 代码 3.1 C++端代码 3.1.1 主要逻辑
// 创建websocket服务端
m_websocketServer = new WebSocketServer();

VideoCapture cap;
cap.open(0, CAP_DSHOW);  // 打开摄像头,采用 CAP_DSHOW 比 CAP_ANY 打开摄像头要快很多

Mat frame;
while (cv::waitKey(1))
{
	// 抓取图片
	if (!cap.read(frame))
	{
		qDebug() << "No frames grabbed!n";
		break;
	}
	
	// cv::flip(frame, frame, 1);   // 左右镜像

	// cv::Mat 格式数据转换为jpg格式数据
	std::vector buf;
	cvMatToJPG(frame, buf);

	QByteArray jpgData = QByteArray::fromRawData(reinterpret_cast(buf.data()), buf.size());
	
	// 发送图片数据到Web端
	emit m_websocketServer->sendBinaryMessage(jpgData);		
}
cv::Mat格式数据转换为jpg格式数据
void cvMatToJPG(const cv::Mat &input, std::vector& buf)
{
    // jpeg编码
    std::vector params;
    params.resize(3, 0);
    params[0] = cv::IMWRITE_JPEG_QUALITY;
    params[1] = 90;     // 压缩率

    cv::imencode(".jpg", input, buf, params);
}
3.1.2 websocket服务端代码

websocket服务端代码详见: gitee
里面的 websocketserver.h 和 websocketserver.cpp
这里就不展示了


3.2 Web端代码 index.html




    
    
    
    视频流测试

    
    

    
        					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存