将 openCV C++ 视频流式传输到浏览器

2024-01-16

我正在尝试使用 C++ 中的 openCV 捕获内置网络摄像头,并进行一些处理。到目前为止,这是有效的。

现在我想将网络摄像头流式传输到浏览器。我怎样才能实现这一目标?

  • Should I create a WebSocket? Or use a UPD Socket?
    • Poco::Net::WebSocket http://pocoproject.org/docs/Poco.Net.WebSocket.html
  • 如何在浏览器中显示该内容? HTML5 和 JS 可以实现吗?

谢谢。


我可能有点晚了,但由于我在 StackOverflow 中没有找到 C++ 和 mjpeg 的完全更新的解决方案,所以考虑写一个新的答案。

现在有一些很好且简单的 C++ 任务库(c++ mjpg Streaming to html)

https://github.com/nadjieb/cpp-mjpeg-streamer https://github.com/nadjieb/cpp-mjpeg-streamer

https://github.com/jacksonliam/mjpg-streamer https://github.com/jacksonliam/mjpg-streamer

https://github.com/codewithpassion/mjpg-streamer/tree/master/mjpg-streamer https://github.com/codewithpassion/mjpg-streamer/tree/master/mjpg-streamer

我发现第一个非常简单。您需要 CMake,并在系统中安装 make。

git clone https://github.com/nadjieb/cpp-mjpeg-streamer.git;
cd cpp-mjpeg-streamer;
mkdir build && cd build;
cmake ../;
make;
sudo make install;
  • 确保您安装了正确版本的 OpenCV。

现在,编写流光:

mjpeg_server.cc

#include <opencv2/opencv.hpp>

#include <nadjieb/mjpeg_streamer.hpp>

// for convenience
using MJPEGStreamer = nadjieb::MJPEGStreamer;

int main()
{
    cv::VideoCapture cap;
    cap.open("demo.mp4"); 
    if (!cap.isOpened())
    {
        std::cerr << "VideoCapture not opened\n";
        exit(EXIT_FAILURE);
    }

    std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 90};

    MJPEGStreamer streamer;

    // By default 1 worker is used for streaming
    // if you want to use 4 workers:
    //      streamer.start(8080, 4);
    streamer.start(8000);

    // Visit /shutdown or another defined target to stop the loop and graceful shutdown
    while (streamer.isAlive())
    {
        cv::Mat frame;
        cap >> frame;
        if (frame.empty())
        {
            std::cerr << "frame not grabbed\n";
            //continue;
            exit(EXIT_FAILURE);
        }

        // http://localhost:8080/bgr
        std::vector<uchar> buff_bgr;
        cv::imencode(".jpg", frame, buff_bgr, params);
        streamer.publish("/bgr", std::string(buff_bgr.begin(), buff_bgr.end()));

        cv::Mat hsv;
        cv::cvtColor(frame, hsv, cv::COLOR_BGR2HSV);

        // http://localhost:8080/hsv
        std::vector<uchar> buff_hsv;
        cv::imencode(".jpg", hsv, buff_hsv, params);
        streamer.publish("/hsv", std::string(buff_hsv.begin(), buff_hsv.end()));

        // std::cout<< "published" << std::endl;
    }

    streamer.stop();
}

写下CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(mjpeg_streamer CXX)

find_package(OpenCV 4.2 REQUIRED)
find_package(nadjieb_mjpeg_streamer REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(stream_test
  "mjpeg_server.cc")
target_compile_features(stream_test PRIVATE cxx_std_11)
target_link_libraries(stream_test PRIVATE nadjieb_mjpeg_streamer::nadjieb_mjpeg_streamer
                     ${OpenCV_LIBS})


| --- mjpeg_server.cc
| --- CMakeLists.txt
| --- ...
| --- build  
      | --- demo.mp4
      | --- ...

现在,我们可以构建流媒体了。

mkdir build && cd build;
cmake ../;
make;
./stream_test

现在,如果你去"http://ip_address:port/bgr" or, "http://ip_address:port/hsv"您应该能够看到该流。就我而言,ip = 192.168.1.7 / localhost,端口 = 8000。

如果你想用另一台服务器抓取流,

index.html

<html>
  <body>
    <img src="http://localhost:8000/bgr">
    <img src="http://localhost:8000/hsv">
  </body>
</html>

serve.py

import http.server
import socketserver

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.path = 'index.html'
        return http.server.SimpleHTTPRequestHandler.do_GET(self)

# Create an object of the above class
handler_object = MyHttpRequestHandler

PORT = 8080
my_server = socketserver.TCPServer(("", PORT), handler_object)

# Star the server
my_server.serve_forever()

python3 serve.py

最后,尽管它非常简单,但它并不安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 openCV C++ 视频流式传输到浏览器 的相关文章

随机推荐

  • 在 Makefile 脚本中读取用户输入

    我有一个非常简单的 Makefile 只是递归调用另一个子目录 make all cd addons godot haskell plugin make cd run cd addons godot haskell plugin make
  • 如何使用nosetests分别组织和运行单元测试和功能测试

    我有以下典型的 python 项目文件结构 packageA subpackage1 classa py subpackage2 classb py test subpackage1 classa test py subpackage2 c
  • 链接 boost 库时程序退出且没有错误

    我在将 boost 库链接到交叉编译的 C 程序中时遇到问题 我编写的代码是在 Ubuntu 12 04 下与 CodeSourcery 交叉编译的 用于 arm 目标 Pandaboard 也是 Ubuntu 12 04 在没有库的情况下
  • 在循环内绑定 PDO 语句的参数

    我正在尝试在循环内绑定 SQL 查询的参数 db new PDO mysql dbname test host localhost test stmt db gt prepare INSERT INTO entries VALUES NUL
  • 如果为 null,则设置为新实例的 C# 扩展方法

    我有以下扩展方法来帮助我检查和实例化对象 如果它们为空 前两个工作正常 但不是很有用 public static bool IsNull
  • 在 Mac 上的 Python 中创建消息框?

    目前正在学习 Cybrary 的免费 Python 在线课程 我正在使用 3 6 进行编码 但我使用的是 Mac 而演示者使用的是 Windows 到目前为止 如果有的话 差异也很小 然而 当前部分涉及学习和使用 Ctypes 作业 说的是
  • Postgresql - 在 sql 脚本中将参数传递给 COPY

    我可以使用 v v1 foo语法对于我的 sql 脚本中的查询来说很好 但我不知道如何在复制语句中使用该参数 我想执行如下脚本 psql d my db f exports sql v v1 Users username test json
  • 如何在 GWT 中使用 XMLHttpRequest?

    XMLHttpRequest 是 GWT 客户端 HTTP 调用的替代方案 允许控制请求 响应的各个方面 但如何使用呢 javadoc地址 http www gwtproject org javadoc latest com google
  • Django url 参数和反向 URL

    我有一个看起来像这样的视图 def selectCity request the city request session ciudad the city city request session ciudad return HttpRes
  • OAuth 自定义提供程序 C#

    我需要创建一个自己的 OAUTH 提供商 以验证第三方应用程序请求 我不想使用 Google Twitter LinkedIn Microsoft 提供商 我必须创建自己的提供程序来验证请求并向客户端返回访问令牌 但网上的所有帮助都与外部提
  • 授权属性的 MVC5 声明版本

    我正在使用 MVC5 和新的 OWIN 身份验证中间件尝试 VS2013 RC 中的一些新功能 所以 我习惯使用 Authorize 属性来按角色限制操作 但我正在尝试使用基于声明 活动的授权 但我找不到它的等效属性 我是否缺少一个明显的东
  • XMPP Bosh 与 SignalR

    XMPP相对于SignalR有更多优势吗 它们都使用 http 长轮询机制 我无法决定是否应该使用 XMPP 作为我的聊天应用程序 还是应该使用 SignalR 并将所有内容保留在我的 IIS 服务器上 SignalR 使用多种传输方式 请
  • 如何在源代码中强制执行单线程构建

    背景 我为一些非常专业的数据处理创建了许多小型实用程序 通常 我是唯一的用户 我什至没有考虑多线程编程 因为运行时性能对于我的用例来说已经足够了 关键资源是我的编程时间 所以我想避免多线程编程所需的任何额外工作 然而 当我将来重用我的代码时
  • android - “您的设备与此版本不兼容”

    我在 Play 商店中放置了一个应用程序 我运行 4 1 Nexus 7 的朋友在尝试安装我的应用程序时收到以下消息 您的设备与此版本不兼容 为什么这个来了 请任何人帮助我 Manifeast file lt xml version 1 0
  • Android 中 Google 地图标记周围的脉冲环动画

    我想在 Android google mapFragment 中的蓝点当前用户位置添加脉冲环动画 如 Uber 有人能帮我解决这件事吗 我找到了向标记添加脉动动画的解决方案 这是地图部分 这里变量 map 表示您的地图 private Ci
  • 如何优化以下for循环代码?

    我有一个非常大的数据集 我正在使用以下代码 计算花费了太多时间 我想减少迭代次数 如何提高代码的性能 import numpy as np Z np asarray 1 2 3 4 5 6 7 8 R np asarray 1 2 3 4
  • Firestore Timestamp.fromDate 不是 UTC

    有人知道如何在 Firestore 中保留 UTC 时间戳吗 In my Angular应用程序 如果我将今天的日期转换为如下所示的时间戳 我最终会得到一个UTC 2 瑞士现在是夏令时 Firestore 数据库中的日期 import fi
  • GAE NDB 安装已部署

    我的 Google App Engine 应用程序使用数据存储区 NDB 所以我要导入 from google appengine ext import ndb 但是当我部署并转到我的应用程序时出现错误 ModuleNotFoundErro
  • 剧作家未收到事件

    我对编剧有意见page waitForEvent https playwright dev docs api class page page wait for event 我希望我的测试在单击链接后导航到不同页面后等待我们的应用程序触发的特
  • 将 openCV C++ 视频流式传输到浏览器

    我正在尝试使用 C 中的 openCV 捕获内置网络摄像头 并进行一些处理 到目前为止 这是有效的 现在我想将网络摄像头流式传输到浏览器 我怎样才能实现这一目标 Should I create a WebSocket Or use a UP