上个版本: 只是用到ctypes进行传输, 这次将python服务端更改为C++服务端,方便后续维护.
本文实现功能: python传输图片给C++, C++接受图片后对图片进行处理,并将结果返回给python客户端, pass image from python to C++
C++ 服务端#
.h文件#
注意文中的model
<span class="token comment">// .h</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">once</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdlib.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><sys/socket.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><arpa/inet.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><netinet/in.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><signal.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><opencv2/opencv.hpp></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> cv<span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">ModelManager</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">ServerManager</span><span class="token punctuation">{</span><span class="token keyword">private</span><span class="token operator">:</span><span class="token keyword">int</span> m_port<span class="token punctuation">;</span><span class="token keyword">char</span> <span class="token operator">*</span>m_addr<span class="token punctuation">;</span>cv<span class="token double-colon punctuation">::</span>VideoCapture m_cap<span class="token punctuation">;</span><span class="token keyword">int</span> m_server<span class="token punctuation">;</span><span class="token keyword">int</span> m_accept<span class="token punctuation">;</span> <span class="token comment">// client conn</span><span class="token keyword">public</span><span class="token operator">:</span><span class="token keyword">bool</span> <span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&</span>port<span class="token punctuation">,</span> <span class="token keyword">const</span> cv<span class="token double-colon punctuation">::</span>VideoCapture <span class="token operator">&</span>cap<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&</span>port<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">build_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>ptr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">free_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">send_data_frame</span><span class="token punctuation">(</span>ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">receive_data_frame</span><span class="token punctuation">(</span>cv<span class="token double-colon punctuation">::</span>Mat <span class="token operator">&</span>frame<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">// .h</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">once</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdlib.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><sys/socket.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><arpa/inet.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><netinet/in.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><signal.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><opencv2/opencv.hpp></span></span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> cv<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">ModelManager</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">ServerManager</span> <span class="token punctuation">{</span> <span class="token keyword">private</span><span class="token operator">:</span> <span class="token keyword">int</span> m_port<span class="token punctuation">;</span> <span class="token keyword">char</span> <span class="token operator">*</span>m_addr<span class="token punctuation">;</span> cv<span class="token double-colon punctuation">::</span>VideoCapture m_cap<span class="token punctuation">;</span> <span class="token keyword">int</span> m_server<span class="token punctuation">;</span> <span class="token keyword">int</span> m_accept<span class="token punctuation">;</span> <span class="token comment">// client conn</span> <span class="token keyword">public</span><span class="token operator">:</span> <span class="token keyword">bool</span> <span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&</span>port<span class="token punctuation">,</span> <span class="token keyword">const</span> cv<span class="token double-colon punctuation">::</span>VideoCapture <span class="token operator">&</span>cap<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> <span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&</span>port<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> <span class="token function">build_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> <span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>ptr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> <span class="token function">free_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> <span class="token function">send_data_frame</span><span class="token punctuation">(</span>ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> <span class="token function">receive_data_frame</span><span class="token punctuation">(</span>cv<span class="token double-colon punctuation">::</span>Mat <span class="token operator">&</span>frame<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>// .h #pragma once #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <signal.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; class ModelManager; class ServerManager { private: int m_port; char *m_addr; cv::VideoCapture m_cap; int m_server; int m_accept; // client conn public: bool initialization(const int &port, const cv::VideoCapture &cap, char *addr = nullptr); bool initialization(const int &port, char *addr = nullptr); bool build_connect(); bool acceptClient(); void error_print(const char *ptr); bool free_connect(); bool send_data_frame(ModelManager& model); bool receive_data_frame(cv::Mat &frame, ModelManager& model); };
.cpp文件#
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ServerManager.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ModelManager.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">BUFFER_SIZE</span> <span class="token expression"><span class="token number">65538</span></span></span><span class="token keyword">void</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> ptr<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">perror</span><span class="token punctuation">(</span>ptr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">exit</span><span class="token punctuation">(</span>EXIT_FAILURE<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span><span class="token operator">&</span> port<span class="token punctuation">,</span> <span class="token keyword">const</span> cv<span class="token double-colon punctuation">::</span>VideoCapture<span class="token operator">&</span> cap<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">)</span><span class="token punctuation">{</span>m_port <span class="token operator">=</span> <span class="token function">htons</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>m_addr <span class="token operator">=</span> addr<span class="token punctuation">;</span>m_cap <span class="token operator">=</span> cap<span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span><span class="token operator">&</span> port<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">)</span><span class="token punctuation">{</span>m_port <span class="token operator">=</span> <span class="token function">htons</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>m_addr <span class="token operator">=</span> addr<span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">build_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">struct</span> <span class="token class-name">sockaddr_in</span> server_addr<span class="token punctuation">;</span><span class="token function">bzero</span><span class="token punctuation">(</span><span class="token operator">&</span>server_addr<span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>server_addr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>server_addr<span class="token punctuation">.</span>sin_family <span class="token operator">=</span> AF_INET<span class="token punctuation">;</span>server_addr<span class="token punctuation">.</span>sin_addr<span class="token punctuation">.</span>s_addr <span class="token operator">=</span> m_addr<span class="token operator">?</span><span class="token function">inet_addr</span><span class="token punctuation">(</span>m_addr<span class="token punctuation">)</span><span class="token operator">:</span>INADDR_ANY<span class="token punctuation">;</span>server_addr<span class="token punctuation">.</span>sin_port <span class="token operator">=</span> m_port<span class="token punctuation">;</span><span class="token comment">// create socket </span>m_server <span class="token operator">=</span> <span class="token function">socket</span><span class="token punctuation">(</span>AF_INET<span class="token punctuation">,</span> SOCK_STREAM<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span><span class="token punctuation">(</span>m_server <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"socket bind error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// can reuse port</span><span class="token keyword">int</span> on <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">setsockopt</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span>SOL_SOCKET<span class="token punctuation">,</span>SO_REUSEADDR<span class="token punctuation">,</span><span class="token operator">&</span>on<span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>on<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"setsockopt error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// bind addr</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">bind</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">sockaddr</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token operator">&</span>server_addr<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>server_addr<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"bind error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// listen only one client</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">listen</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"listen failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>cout <span class="token operator"><<</span> <span class="token string">"ServerManager is listening, plesae wait..."</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">struct</span> <span class="token class-name">sockaddr_in</span> accept_addr<span class="token punctuation">;</span>socklen_t accept_len <span class="token operator">=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>accept_addr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">bzero</span><span class="token punctuation">(</span><span class="token operator">&</span>accept_addr<span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>accept_addr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// accept client connection</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>m_accept <span class="token operator">=</span> <span class="token function">accept</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">sockaddr</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token operator">&</span>accept_addr<span class="token punctuation">,</span><span class="token operator">&</span>accept_len<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"accept error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token string">"Connection established"</span> <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">send_data_frame</span><span class="token punctuation">(</span>ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">char</span> <span class="token operator">*</span>json_output <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">;</span>json_output <span class="token operator">=</span> model<span class="token punctuation">.</span><span class="token function">createJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span>json_output <span class="token operator">==</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// printf("send data %s\n", json_output);</span><span class="token comment">// just send json_output, dont memcpy new char*!!! it wastes me two hours</span><span class="token comment">// send json</span><span class="token keyword">int</span> result <span class="token operator">=</span> <span class="token function">send</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">,</span> json_output<span class="token punctuation">,</span> <span class="token function">strlen</span><span class="token punctuation">(</span>json_output<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span>result <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>cout <span class="token operator"><<</span> <span class="token string">"send fail"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">receive_data_frame</span><span class="token punctuation">(</span>Mat<span class="token operator">&</span> frame<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// recv frame size</span><span class="token keyword">int</span> data_size<span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">recv</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">,</span> <span class="token operator">&</span>data_size<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>data_size<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>data_size<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">// when client close, then close connection</span><span class="token function">close</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">)</span><span class="token punctuation">;</span>cout <span class="token operator"><<</span> <span class="token string">"close connection to client"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span><span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// restart a new accept, to accept new connection</span><span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token punctuation">}</span>cout <span class="token operator"><<</span> data_size <span class="token operator"><<</span> endl<span class="token punctuation">;</span><span class="token comment">// recv frame data</span><span class="token comment">// char buf[data_size];</span><span class="token comment">// std::vector<uchar> decode;</span><span class="token comment">// int bytes_received = 0;</span><span class="token comment">// do</span><span class="token comment">// {</span><span class="token comment">// int nBytes = recv(m_accept, buf, data_size - bytes_received, 0);</span><span class="token comment">// for (int i = 0; i < nBytes; i++) // maybe can use memcpy, maybe faster</span><span class="token comment">// {</span><span class="token comment">// decode.emplace_back(buf[i]);</span><span class="token comment">// }</span><span class="token comment">// cout << bytes_received << endl;</span><span class="token comment">// bytes_received += nBytes;</span><span class="token comment">// } while (bytes_received < data_size);</span><span class="token keyword">char</span> <span class="token operator">*</span>recv_char <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">char</span><span class="token punctuation">[</span>data_size<span class="token punctuation">]</span><span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span>uchar<span class="token operator">></span> <span class="token function">decode</span><span class="token punctuation">(</span>data_size<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> bytes_received <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> count <span class="token operator">=</span> data_size<span class="token punctuation">;</span><span class="token keyword">while</span> <span class="token punctuation">(</span>count <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">// if count >= 0, dead loop</span><span class="token punctuation">{</span><span class="token keyword">int</span> iRet <span class="token operator">=</span> <span class="token function">recv</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">,</span> recv_char<span class="token punctuation">,</span> count<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">>=</span> data_size<span class="token punctuation">)</span> index <span class="token operator">=</span> data_size<span class="token punctuation">;</span><span class="token function">memcpy</span><span class="token punctuation">(</span><span class="token operator">&</span>decode<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">,</span> recv_char <span class="token punctuation">,</span> iRet<span class="token punctuation">)</span><span class="token punctuation">;</span>index <span class="token operator">+=</span> iRet<span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>iRet<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>count <span class="token operator">-=</span> iRet<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// decode message</span>frame <span class="token operator">=</span> <span class="token function">imdecode</span><span class="token punctuation">(</span>decode<span class="token punctuation">,</span> cv<span class="token double-colon punctuation">::</span>IMREAD_COLOR<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// push into Model's queueMat</span>model<span class="token punctuation">.</span>mtxQueueImg<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>model<span class="token punctuation">.</span>queueMat<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span>model<span class="token punctuation">.</span>mtxQueueImg<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">free_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>m_cap<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">close</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">close</span><span class="token punctuation">(</span>m_server<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ServerManager.h"</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ModelManager.h"</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">BUFFER_SIZE</span> <span class="token expression"><span class="token number">65538</span></span></span> <span class="token keyword">void</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">error_print</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> ptr<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">perror</span><span class="token punctuation">(</span>ptr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">exit</span><span class="token punctuation">(</span>EXIT_FAILURE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span><span class="token operator">&</span> port<span class="token punctuation">,</span> <span class="token keyword">const</span> cv<span class="token double-colon punctuation">::</span>VideoCapture<span class="token operator">&</span> cap<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">)</span><span class="token punctuation">{</span> m_port <span class="token operator">=</span> <span class="token function">htons</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span> m_addr <span class="token operator">=</span> addr<span class="token punctuation">;</span> m_cap <span class="token operator">=</span> cap<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">initialization</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span><span class="token operator">&</span> port<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">)</span><span class="token punctuation">{</span> m_port <span class="token operator">=</span> <span class="token function">htons</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span> m_addr <span class="token operator">=</span> addr<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">build_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">struct</span> <span class="token class-name">sockaddr_in</span> server_addr<span class="token punctuation">;</span> <span class="token function">bzero</span><span class="token punctuation">(</span><span class="token operator">&</span>server_addr<span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>server_addr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> server_addr<span class="token punctuation">.</span>sin_family <span class="token operator">=</span> AF_INET<span class="token punctuation">;</span> server_addr<span class="token punctuation">.</span>sin_addr<span class="token punctuation">.</span>s_addr <span class="token operator">=</span> m_addr<span class="token operator">?</span><span class="token function">inet_addr</span><span class="token punctuation">(</span>m_addr<span class="token punctuation">)</span><span class="token operator">:</span>INADDR_ANY<span class="token punctuation">;</span> server_addr<span class="token punctuation">.</span>sin_port <span class="token operator">=</span> m_port<span class="token punctuation">;</span> <span class="token comment">// create socket </span> m_server <span class="token operator">=</span> <span class="token function">socket</span><span class="token punctuation">(</span>AF_INET<span class="token punctuation">,</span> SOCK_STREAM<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>m_server <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"socket bind error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// can reuse port</span> <span class="token keyword">int</span> on <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">setsockopt</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span>SOL_SOCKET<span class="token punctuation">,</span>SO_REUSEADDR<span class="token punctuation">,</span><span class="token operator">&</span>on<span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>on<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"setsockopt error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// bind addr</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">bind</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">sockaddr</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token operator">&</span>server_addr<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>server_addr<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"bind error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// listen only one client</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">listen</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"listen failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"ServerManager is listening, plesae wait..."</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">struct</span> <span class="token class-name">sockaddr_in</span> accept_addr<span class="token punctuation">;</span> socklen_t accept_len <span class="token operator">=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>accept_addr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">bzero</span><span class="token punctuation">(</span><span class="token operator">&</span>accept_addr<span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>accept_addr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// accept client connection</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>m_accept <span class="token operator">=</span> <span class="token function">accept</span><span class="token punctuation">(</span>m_server<span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">sockaddr</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token operator">&</span>accept_addr<span class="token punctuation">,</span><span class="token operator">&</span>accept_len<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token function">error_print</span><span class="token punctuation">(</span><span class="token string">"accept error"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token string">"Connection established"</span> <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">send_data_frame</span><span class="token punctuation">(</span>ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">char</span> <span class="token operator">*</span>json_output <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">;</span> json_output <span class="token operator">=</span> model<span class="token punctuation">.</span><span class="token function">createJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>json_output <span class="token operator">==</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// printf("send data %s\n", json_output);</span> <span class="token comment">// just send json_output, dont memcpy new char*!!! it wastes me two hours</span> <span class="token comment">// send json</span> <span class="token keyword">int</span> result <span class="token operator">=</span> <span class="token function">send</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">,</span> json_output<span class="token punctuation">,</span> <span class="token function">strlen</span><span class="token punctuation">(</span>json_output<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>result <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout <span class="token operator"><<</span> <span class="token string">"send fail"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">receive_data_frame</span><span class="token punctuation">(</span>Mat<span class="token operator">&</span> frame<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// recv frame size</span> <span class="token keyword">int</span> data_size<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">recv</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">,</span> <span class="token operator">&</span>data_size<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>data_size<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>data_size<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// when client close, then close connection</span> <span class="token function">close</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">)</span><span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"close connection to client"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// restart a new accept, to accept new connection</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> cout <span class="token operator"><<</span> data_size <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">// recv frame data</span> <span class="token comment">// char buf[data_size];</span> <span class="token comment">// std::vector<uchar> decode;</span> <span class="token comment">// int bytes_received = 0;</span> <span class="token comment">// do</span> <span class="token comment">// {</span> <span class="token comment">// int nBytes = recv(m_accept, buf, data_size - bytes_received, 0);</span> <span class="token comment">// for (int i = 0; i < nBytes; i++) // maybe can use memcpy, maybe faster</span> <span class="token comment">// {</span> <span class="token comment">// decode.emplace_back(buf[i]);</span> <span class="token comment">// }</span> <span class="token comment">// cout << bytes_received << endl;</span> <span class="token comment">// bytes_received += nBytes;</span> <span class="token comment">// } while (bytes_received < data_size);</span> <span class="token keyword">char</span> <span class="token operator">*</span>recv_char <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">char</span><span class="token punctuation">[</span>data_size<span class="token punctuation">]</span><span class="token punctuation">;</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span>uchar<span class="token operator">></span> <span class="token function">decode</span><span class="token punctuation">(</span>data_size<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> bytes_received <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> count <span class="token operator">=</span> data_size<span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>count <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">// if count >= 0, dead loop</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> iRet <span class="token operator">=</span> <span class="token function">recv</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">,</span> recv_char<span class="token punctuation">,</span> count<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">>=</span> data_size<span class="token punctuation">)</span> index <span class="token operator">=</span> data_size<span class="token punctuation">;</span> <span class="token function">memcpy</span><span class="token punctuation">(</span><span class="token operator">&</span>decode<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">,</span> recv_char <span class="token punctuation">,</span> iRet<span class="token punctuation">)</span><span class="token punctuation">;</span> index <span class="token operator">+=</span> iRet<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>iRet<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> count <span class="token operator">-=</span> iRet<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// decode message</span> frame <span class="token operator">=</span> <span class="token function">imdecode</span><span class="token punctuation">(</span>decode<span class="token punctuation">,</span> cv<span class="token double-colon punctuation">::</span>IMREAD_COLOR<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// push into Model's queueMat</span> model<span class="token punctuation">.</span>mtxQueueImg<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> model<span class="token punctuation">.</span>queueMat<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span> model<span class="token punctuation">.</span>mtxQueueImg<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> <span class="token class-name">ServerManager</span><span class="token double-colon punctuation">::</span><span class="token function">free_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> m_cap<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">close</span><span class="token punctuation">(</span>m_accept<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">close</span><span class="token punctuation">(</span>m_server<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>#include "ServerManager.h" #include "ModelManager.h" #define BUFFER_SIZE 65538 void ServerManager::error_print(const char * ptr) { perror(ptr); exit(EXIT_FAILURE); } bool ServerManager::initialization(const int& port, const cv::VideoCapture& cap, char* addr){ m_port = htons(port); m_addr = addr; m_cap = cap; return true; } bool ServerManager::initialization(const int& port, char* addr){ m_port = htons(port); m_addr = addr; return true; } bool ServerManager::build_connect() { struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = m_addr?inet_addr(m_addr):INADDR_ANY; server_addr.sin_port = m_port; // create socket m_server = socket(AF_INET, SOCK_STREAM, 0); if(m_server < 0) error_print("socket bind error"); // can reuse port int on = 1; if(setsockopt(m_server,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0) error_print("setsockopt error"); // bind addr if(bind(m_server, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) error_print("bind error"); // listen only one client if(listen(m_server, 1) < 0) error_print("listen failed"); cout << "ServerManager is listening, plesae wait..." << endl; return true; } bool ServerManager::acceptClient(){ struct sockaddr_in accept_addr; socklen_t accept_len = sizeof(accept_addr); bzero(&accept_addr,sizeof(accept_addr)); // accept client connection if((m_accept = accept(m_server,(struct sockaddr*)&accept_addr,&accept_len)) < 0) error_print("accept error"); std::cout << "Connection established" << std::endl; return true; } bool ServerManager::send_data_frame(ModelManager& model) { char *json_output = nullptr; json_output = model.createJson(); if (json_output == nullptr) { return false; } // printf("send data %s\n", json_output); // just send json_output, dont memcpy new char*!!! it wastes me two hours // send json int result = send(m_accept, json_output, strlen(json_output), 0); if (result == -1) { cout << "send fail" << endl; return false; } return true; } bool ServerManager::receive_data_frame(Mat& frame, ModelManager& model) { // recv frame size int data_size; if (recv(m_accept, &data_size, sizeof(data_size), 0) != sizeof(data_size)) { // when client close, then close connection close(m_accept); cout << "close connection to client" << endl; acceptClient(); // restart a new accept, to accept new connection return false; } cout << data_size << endl; // recv frame data // char buf[data_size]; // std::vector<uchar> decode; // int bytes_received = 0; // do // { // int nBytes = recv(m_accept, buf, data_size - bytes_received, 0); // for (int i = 0; i < nBytes; i++) // maybe can use memcpy, maybe faster // { // decode.emplace_back(buf[i]); // } // cout << bytes_received << endl; // bytes_received += nBytes; // } while (bytes_received < data_size); char *recv_char = new char[data_size]; std::vector<uchar> decode(data_size, 0); int index = 0; int bytes_received = 0; int count = data_size; while (count > 0)// if count >= 0, dead loop { int iRet = recv(m_accept, recv_char, count, 0); if (index >= data_size) index = data_size; memcpy(&decode[index], recv_char , iRet); index += iRet; if (!iRet) { return -1; } count -= iRet; } // decode message frame = imdecode(decode, cv::IMREAD_COLOR); // push into Model's queueMat model.mtxQueueImg.lock(); model.queueMat.push(frame); model.mtxQueueImg.unlock(); return true; } bool ServerManager::free_connect() { m_cap.release(); close(m_accept); close(m_server); return true; }
C++ model部分代码#
.h文件#
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">once</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"CV_Classify.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"CV_Detect.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ServerManager.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><opencv2/opencv.hpp></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><mutex></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><queue></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span> <span class="token comment">// usleep</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><thread></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"cJSON.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> cv<span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">ModelManager</span><span class="token punctuation">{</span><span class="token keyword">public</span><span class="token operator">:</span>Detect objdetect<span class="token punctuation">;</span>Classify objclassify<span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>mutex mtxQueueDet<span class="token punctuation">;</span> <span class="token comment">// mutex for detect queue</span>std<span class="token double-colon punctuation">::</span>mutex mtxQueueImg<span class="token punctuation">;</span> <span class="token comment">// mutex for image queue</span>std<span class="token double-colon punctuation">::</span>mutex mtxQueueCls<span class="token punctuation">;</span> <span class="token comment">// mutex for classify queue</span>std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span>cv<span class="token double-colon punctuation">::</span>Mat<span class="token operator">></span> queueMat<span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span>ObjDetectOutput<span class="token operator">></span> queueDetOut<span class="token punctuation">;</span><span class="token comment">// Detect queue</span>std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span>ObjClassifyOutput<span class="token operator">></span> queueClsOut<span class="token punctuation">;</span><span class="token comment">// Classify queue</span><span class="token keyword">bool</span> DetectFlag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token keyword">bool</span> ClassifyFlag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token keyword">bool</span> empty_flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token keyword">friend</span> <span class="token keyword">class</span> <span class="token class-name">ServerManager</span><span class="token punctuation">;</span><span class="token keyword">public</span><span class="token operator">:</span><span class="token keyword">void</span> <span class="token function">initDetectModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">initClassifyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">DetectImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">ClassifyImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">getClsResult</span><span class="token punctuation">(</span>ObjClassifyOutput <span class="token operator">&</span>output<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// ObjClassifyOutput getClsResult();</span><span class="token keyword">char</span><span class="token operator">*</span> <span class="token function">createJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">once</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"CV_Classify.h"</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"CV_Detect.h"</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ServerManager.h"</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><opencv2/opencv.hpp></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><mutex></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><queue></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unistd.h></span> <span class="token comment">// usleep</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><thread></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"cJSON.h"</span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> cv<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">ModelManager</span><span class="token punctuation">{</span> <span class="token keyword">public</span><span class="token operator">:</span> Detect objdetect<span class="token punctuation">;</span> Classify objclassify<span class="token punctuation">;</span> std<span class="token double-colon punctuation">::</span>mutex mtxQueueDet<span class="token punctuation">;</span> <span class="token comment">// mutex for detect queue</span> std<span class="token double-colon punctuation">::</span>mutex mtxQueueImg<span class="token punctuation">;</span> <span class="token comment">// mutex for image queue</span> std<span class="token double-colon punctuation">::</span>mutex mtxQueueCls<span class="token punctuation">;</span> <span class="token comment">// mutex for classify queue</span> std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span>cv<span class="token double-colon punctuation">::</span>Mat<span class="token operator">></span> queueMat<span class="token punctuation">;</span> std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span>ObjDetectOutput<span class="token operator">></span> queueDetOut<span class="token punctuation">;</span><span class="token comment">// Detect queue</span> std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span>ObjClassifyOutput<span class="token operator">></span> queueClsOut<span class="token punctuation">;</span><span class="token comment">// Classify queue</span> <span class="token keyword">bool</span> DetectFlag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> ClassifyFlag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> empty_flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">friend</span> <span class="token keyword">class</span> <span class="token class-name">ServerManager</span><span class="token punctuation">;</span> <span class="token keyword">public</span><span class="token operator">:</span> <span class="token keyword">void</span> <span class="token function">initDetectModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">initClassifyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">DetectImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">ClassifyImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">getClsResult</span><span class="token punctuation">(</span>ObjClassifyOutput <span class="token operator">&</span>output<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ObjClassifyOutput getClsResult();</span> <span class="token keyword">char</span><span class="token operator">*</span> <span class="token function">createJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>#pragma once #include "CV_Classify.h" #include "CV_Detect.h" #include "ServerManager.h" #include <opencv2/opencv.hpp> #include <mutex> #include <queue> #include <unistd.h> // usleep #include <thread> #include "cJSON.h" #include <string> using namespace std; using namespace cv; class ModelManager{ public: Detect objdetect; Classify objclassify; std::mutex mtxQueueDet; // mutex for detect queue std::mutex mtxQueueImg; // mutex for image queue std::mutex mtxQueueCls; // mutex for classify queue std::queue<cv::Mat> queueMat; std::queue<ObjDetectOutput> queueDetOut;// Detect queue std::queue<ObjClassifyOutput> queueClsOut;// Classify queue bool DetectFlag = true; bool ClassifyFlag = true; bool empty_flag = false; friend class ServerManager; public: void initDetectModel() ; void initClassifyModel() ; void DetectImg(); void ClassifyImg(); void getClsResult(ObjClassifyOutput &output); // ObjClassifyOutput getClsResult(); char* createJson(); };
.cpp文件#
部分有删减,createJson可参考使用,利用json来传递值
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ModelManager.h"</span></span><span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">initDetectModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>std<span class="token double-colon punctuation">::</span>string config_path <span class="token operator">=</span> <span class="token string">"DetectConfig.yaml"</span><span class="token punctuation">;</span>objdetect<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span>config_path<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">initClassifyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>std<span class="token double-colon punctuation">::</span>string config_path <span class="token operator">=</span> <span class="token string">"ClassiflyConfig.yaml"</span><span class="token punctuation">;</span>objclassify<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span>config_path<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">DetectImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>DetectInput detect_input<span class="token punctuation">;</span>DetectOutput detect_output<span class="token punctuation">;</span>cv<span class="token double-colon punctuation">::</span>Mat frame<span class="token punctuation">;</span>size_t mm <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span>queueMat<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>DetectFlag<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">break</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// get image from queueMat</span>mtxQueueImg<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>frame <span class="token operator">=</span> queueMat<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>queueMat<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>mtxQueueImg<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// run model</span>objdetect<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span>detect_input<span class="token punctuation">,</span> detect_output<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// push detect result into queueDetOut</span>mtxQueueDet<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>queueDetOut<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>detect_output<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// cout << "detect run !!" << endl;</span>mtxQueueDet<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">ClassifyImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>ObjClassifyInput input<span class="token punctuation">;</span>ObjClassifyOutput output<span class="token punctuation">;</span>cv<span class="token double-colon punctuation">::</span>Mat frame<span class="token punctuation">;</span>Detoutput detect_result<span class="token punctuation">;</span><span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span>queueDetOut<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>ClassifyFlag<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">break</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// get detect from queueDetOut</span>mtxQueueDet<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>detect_result <span class="token operator">=</span> queueDetOut<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>queueDetOut<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>mtxQueueDet<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// run model</span>objclassify<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span>input<span class="token punctuation">,</span> output<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// push cls result into queueClsOut</span>mtxQueueCls<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>queueClsOut<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>output<span class="token punctuation">)</span><span class="token punctuation">;</span>mtxQueueCls<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">getClsResult</span><span class="token punctuation">(</span>ObjClassifyOutput<span class="token operator">&</span> output<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span>queueClsOut<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object_num <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// -1 is now empty;</span><span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token comment">// must return in thread otherwise cant use &output</span><span class="token punctuation">}</span>output <span class="token operator">=</span> queueClsOut<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>queueClsOut<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">char</span><span class="token operator">*</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">createJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// dont know why cant use &value, need return value</span><span class="token punctuation">{</span>mtxQueueCls<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>ObjClassifyOutput output<span class="token punctuation">;</span><span class="token function">getClsResult</span><span class="token punctuation">(</span>output<span class="token punctuation">)</span><span class="token punctuation">;</span>mtxQueueCls<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span>output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object_num <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token keyword">nullptr</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// prepare send data json</span>cJSON<span class="token operator">*</span> json_object_list <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>cJSON<span class="token operator">*</span> json_ObjClassifyOutput <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>json_ObjClassifyOutput <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>json_object_list <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddItemToObject</span><span class="token punctuation">(</span>json_ObjClassifyOutput<span class="token punctuation">,</span> <span class="token string">"object_list"</span><span class="token punctuation">,</span> json_object_list<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> obj_num <span class="token operator">=</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object_num<span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_object_list<span class="token punctuation">,</span> <span class="token string">"object_num"</span><span class="token punctuation">,</span> obj_num<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> obj_num<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span><span class="token punctuation">{</span>cJSON<span class="token operator">*</span> json_object <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>cJSON<span class="token operator">*</span> json_box <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"x"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"y"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"w"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>w<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"h"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>h<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddItemToObject</span><span class="token punctuation">(</span>json_object<span class="token punctuation">,</span><span class="token string">"bbox"</span><span class="token punctuation">,</span> json_box<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_object<span class="token punctuation">,</span> <span class="token string">"classes"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>classes<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_object<span class="token punctuation">,</span> <span class="token string">"objectness"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>objectness<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// double prob = output.object_list.object[i].prob;</span><span class="token comment">// cJSON_AddNumberToObject(json_object, "prob", prob); // pointer cant use?</span>string str <span class="token operator">=</span> <span class="token string">"object"</span> <span class="token operator">+</span> <span class="token function">to_string</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_AddItemToObject</span><span class="token punctuation">(</span>json_object_list<span class="token punctuation">,</span> str<span class="token punctuation">.</span><span class="token function">c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> json_object<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// printf("prob: %f", output.object_list.object[i].prob);</span><span class="token punctuation">}</span><span class="token keyword">char</span><span class="token operator">*</span> json_output <span class="token operator">=</span> <span class="token function">cJSON_Print</span><span class="token punctuation">(</span>json_ObjClassifyOutput<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">cJSON_Delete</span><span class="token punctuation">(</span>json_ObjClassifyOutput<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">return</span> json_output<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"ModelManager.h"</span></span> <span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">initDetectModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> std<span class="token double-colon punctuation">::</span>string config_path <span class="token operator">=</span> <span class="token string">"DetectConfig.yaml"</span><span class="token punctuation">;</span> objdetect<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span>config_path<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">initClassifyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> std<span class="token double-colon punctuation">::</span>string config_path <span class="token operator">=</span> <span class="token string">"ClassiflyConfig.yaml"</span><span class="token punctuation">;</span> objclassify<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span>config_path<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">DetectImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> DetectInput detect_input<span class="token punctuation">;</span> DetectOutput detect_output<span class="token punctuation">;</span> cv<span class="token double-colon punctuation">::</span>Mat frame<span class="token punctuation">;</span> size_t mm <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>queueMat<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>DetectFlag<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// get image from queueMat</span> mtxQueueImg<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> frame <span class="token operator">=</span> queueMat<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> queueMat<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mtxQueueImg<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// run model</span> objdetect<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span>detect_input<span class="token punctuation">,</span> detect_output<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// push detect result into queueDetOut</span> mtxQueueDet<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> queueDetOut<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>detect_output<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// cout << "detect run !!" << endl;</span> mtxQueueDet<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">ClassifyImg</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ObjClassifyInput input<span class="token punctuation">;</span> ObjClassifyOutput output<span class="token punctuation">;</span> cv<span class="token double-colon punctuation">::</span>Mat frame<span class="token punctuation">;</span> Detoutput detect_result<span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>queueDetOut<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>ClassifyFlag<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// get detect from queueDetOut</span> mtxQueueDet<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> detect_result <span class="token operator">=</span> queueDetOut<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> queueDetOut<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mtxQueueDet<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// run model</span> objclassify<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span>input<span class="token punctuation">,</span> output<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// push cls result into queueClsOut</span> mtxQueueCls<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> queueClsOut<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>output<span class="token punctuation">)</span><span class="token punctuation">;</span> mtxQueueCls<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">getClsResult</span><span class="token punctuation">(</span>ObjClassifyOutput<span class="token operator">&</span> output<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>queueClsOut<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object_num <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// -1 is now empty;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token comment">// must return in thread otherwise cant use &output</span> <span class="token punctuation">}</span> output <span class="token operator">=</span> queueClsOut<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> queueClsOut<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">char</span><span class="token operator">*</span> <span class="token class-name">ModelManager</span><span class="token double-colon punctuation">::</span><span class="token function">createJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// dont know why cant use &value, need return value</span> <span class="token punctuation">{</span> mtxQueueCls<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ObjClassifyOutput output<span class="token punctuation">;</span> <span class="token function">getClsResult</span><span class="token punctuation">(</span>output<span class="token punctuation">)</span><span class="token punctuation">;</span> mtxQueueCls<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object_num <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">nullptr</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// prepare send data json</span> cJSON<span class="token operator">*</span> json_object_list <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span> cJSON<span class="token operator">*</span> json_ObjClassifyOutput <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span> json_ObjClassifyOutput <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> json_object_list <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddItemToObject</span><span class="token punctuation">(</span>json_ObjClassifyOutput<span class="token punctuation">,</span> <span class="token string">"object_list"</span><span class="token punctuation">,</span> json_object_list<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> obj_num <span class="token operator">=</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object_num<span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_object_list<span class="token punctuation">,</span> <span class="token string">"object_num"</span><span class="token punctuation">,</span> obj_num<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> obj_num<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span><span class="token punctuation">{</span> cJSON<span class="token operator">*</span> json_object <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cJSON<span class="token operator">*</span> json_box <span class="token operator">=</span> <span class="token function">cJSON_CreateObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"x"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"y"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"w"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>w<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_box<span class="token punctuation">,</span><span class="token string">"h"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>bbox<span class="token punctuation">.</span>h<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddItemToObject</span><span class="token punctuation">(</span>json_object<span class="token punctuation">,</span><span class="token string">"bbox"</span><span class="token punctuation">,</span> json_box<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_object<span class="token punctuation">,</span> <span class="token string">"classes"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>classes<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddNumberToObject</span><span class="token punctuation">(</span>json_object<span class="token punctuation">,</span> <span class="token string">"objectness"</span><span class="token punctuation">,</span> output<span class="token punctuation">.</span>object_list<span class="token punctuation">.</span>object<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>objectness<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// double prob = output.object_list.object[i].prob;</span> <span class="token comment">// cJSON_AddNumberToObject(json_object, "prob", prob); // pointer cant use?</span> string str <span class="token operator">=</span> <span class="token string">"object"</span> <span class="token operator">+</span> <span class="token function">to_string</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_AddItemToObject</span><span class="token punctuation">(</span>json_object_list<span class="token punctuation">,</span> str<span class="token punctuation">.</span><span class="token function">c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> json_object<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// printf("prob: %f", output.object_list.object[i].prob);</span> <span class="token punctuation">}</span> <span class="token keyword">char</span><span class="token operator">*</span> json_output <span class="token operator">=</span> <span class="token function">cJSON_Print</span><span class="token punctuation">(</span>json_ObjClassifyOutput<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">cJSON_Delete</span><span class="token punctuation">(</span>json_ObjClassifyOutput<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> json_output<span class="token punctuation">;</span> <span class="token punctuation">}</span>#include "ModelManager.h" void ModelManager::initDetectModel() { std::string config_path = "DetectConfig.yaml"; objdetect.Init(config_path, 1); } void ModelManager::initClassifyModel() { std::string config_path = "ClassiflyConfig.yaml"; objclassify.Init(config_path, 1); } void ModelManager::DetectImg() { DetectInput detect_input; DetectOutput detect_output; cv::Mat frame; size_t mm = 0; while(1) { if (queueMat.empty()) { if(!DetectFlag) { break; } usleep(2000); continue; } // get image from queueMat mtxQueueImg.lock(); frame = queueMat.front(); queueMat.pop(); mtxQueueImg.unlock(); // run model objdetect.Run(detect_input, detect_output); // push detect result into queueDetOut mtxQueueDet.lock(); queueDetOut.push(detect_output); // cout << "detect run !!" << endl; mtxQueueDet.unlock(); } return; } void ModelManager::ClassifyImg() { ObjClassifyInput input; ObjClassifyOutput output; cv::Mat frame; Detoutput detect_result; while(1) { if (queueDetOut.empty()) { if(!ClassifyFlag) { break; } usleep(2000); continue; } // get detect from queueDetOut mtxQueueDet.lock(); detect_result = queueDetOut.front(); queueDetOut.pop(); mtxQueueDet.unlock(); // run model objclassify.Run(input, output); // push cls result into queueClsOut mtxQueueCls.lock(); queueClsOut.push(output); mtxQueueCls.unlock(); } return; } void ModelManager::getClsResult(ObjClassifyOutput& output){ if (queueClsOut.empty()){ output.object_list.object_num = -1; // -1 is now empty; return; // must return in thread otherwise cant use &output } output = queueClsOut.front(); queueClsOut.pop(); return; } char* ModelManager::createJson() // dont know why cant use &value, need return value { mtxQueueCls.lock(); ObjClassifyOutput output; getClsResult(output); mtxQueueCls.unlock(); if (output.object_list.object_num == -1){ return nullptr; } // prepare send data json cJSON* json_object_list = NULL; cJSON* json_ObjClassifyOutput = NULL; json_ObjClassifyOutput = cJSON_CreateObject(); json_object_list = cJSON_CreateObject(); cJSON_AddItemToObject(json_ObjClassifyOutput, "object_list", json_object_list); int obj_num = output.object_list.object_num; cJSON_AddNumberToObject(json_object_list, "object_num", obj_num); for (int i = 0; i < obj_num; ++i){ cJSON* json_object = cJSON_CreateObject(); cJSON* json_box = cJSON_CreateObject(); cJSON_AddNumberToObject(json_box,"x", output.object_list.object[i].bbox.x); cJSON_AddNumberToObject(json_box,"y", output.object_list.object[i].bbox.y); cJSON_AddNumberToObject(json_box,"w", output.object_list.object[i].bbox.w); cJSON_AddNumberToObject(json_box,"h", output.object_list.object[i].bbox.h); cJSON_AddItemToObject(json_object,"bbox", json_box); cJSON_AddNumberToObject(json_object, "classes", output.object_list.object[i].classes); cJSON_AddNumberToObject(json_object, "objectness", output.object_list.object[i].objectness); // double prob = output.object_list.object[i].prob; // cJSON_AddNumberToObject(json_object, "prob", prob); // pointer cant use? string str = "object" + to_string(i); cJSON_AddItemToObject(json_object_list, str.c_str(), json_object); // printf("prob: %f", output.object_list.object[i].prob); } char* json_output = cJSON_Print(json_ObjClassifyOutput); cJSON_Delete(json_ObjClassifyOutput); return json_output; }
C++ 服务端运行#
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><../include/ServerManager.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><../include/ModelManager.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><thread></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">PORT</span> <span class="token expression"><span class="token number">8080</span></span></span><span class="token keyword">void</span> <span class="token function">recvServer</span><span class="token punctuation">(</span>ServerManager<span class="token operator">&</span> s<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">int</span> idx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">// auto start = std::chrono::steady_clock::now();</span>cv<span class="token double-colon punctuation">::</span>Mat frame<span class="token punctuation">;</span>s<span class="token punctuation">.</span><span class="token function">receive_data_frame</span><span class="token punctuation">(</span>frame<span class="token punctuation">,</span> model<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// cal time cost</span><span class="token comment">// auto end = std::chrono::steady_clock::now();</span><span class="token comment">// std::chrono::duration<double, std::milli> elapsed = end - start;</span><span class="token comment">// std::cout << "recv execution time: " << elapsed.count() << " ms\n";</span><span class="token keyword">if</span> <span class="token punctuation">(</span>frame<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// cv::imwrite("image"+to_string(idx++)+".jpg", frame);</span>std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token string">"Image "</span> <span class="token operator"><<</span> idx<span class="token operator">++</span> <span class="token operator"><<</span><span class="token string">" received !!"</span> <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">sendServer</span><span class="token punctuation">(</span>ServerManager<span class="token operator">&</span> s<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">.</span><span class="token function">send_data_frame</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>cout <span class="token operator"><<</span> <span class="token string">"send success!!"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span>cout <span class="token operator"><<</span> endl<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span><span class="token comment">// cout << "send fail!!" << endl;</span><span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>ServerManager s<span class="token punctuation">;</span>ModelManager model<span class="token punctuation">;</span>model<span class="token punctuation">.</span><span class="token function">initDetectModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>model<span class="token punctuation">.</span><span class="token function">initClassifyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>cout <span class="token operator"><<</span> endl<span class="token punctuation">;</span>s<span class="token punctuation">.</span><span class="token function">initialization</span><span class="token punctuation">(</span>PORT<span class="token punctuation">)</span><span class="token punctuation">;</span>s<span class="token punctuation">.</span><span class="token function">build_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>s<span class="token punctuation">.</span><span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>thread <span class="token function">recv_server</span><span class="token punctuation">(</span>recvServer<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>thread <span class="token function">send_server</span><span class="token punctuation">(</span>sendServer<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>thread <span class="token function">detect</span><span class="token punctuation">(</span><span class="token operator">&</span>ModelManager<span class="token double-colon punctuation">::</span>DetectImg<span class="token punctuation">,</span> <span class="token operator">&</span>model<span class="token punctuation">)</span><span class="token punctuation">;</span>thread <span class="token function">classfy</span><span class="token punctuation">(</span><span class="token operator">&</span>ModelManager<span class="token double-colon punctuation">::</span>ClassifyImg<span class="token punctuation">,</span> <span class="token operator">&</span>model<span class="token punctuation">)</span><span class="token punctuation">;</span>detect<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>classfy<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>recv_server<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>send_server<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><../include/ServerManager.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><../include/ModelManager.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><thread></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">PORT</span> <span class="token expression"><span class="token number">8080</span></span></span> <span class="token keyword">void</span> <span class="token function">recvServer</span><span class="token punctuation">(</span>ServerManager<span class="token operator">&</span> s<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> idx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// auto start = std::chrono::steady_clock::now();</span> cv<span class="token double-colon punctuation">::</span>Mat frame<span class="token punctuation">;</span> s<span class="token punctuation">.</span><span class="token function">receive_data_frame</span><span class="token punctuation">(</span>frame<span class="token punctuation">,</span> model<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// cal time cost</span> <span class="token comment">// auto end = std::chrono::steady_clock::now();</span> <span class="token comment">// std::chrono::duration<double, std::milli> elapsed = end - start;</span> <span class="token comment">// std::cout << "recv execution time: " << elapsed.count() << " ms\n";</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>frame<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// cv::imwrite("image"+to_string(idx++)+".jpg", frame);</span> std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> <span class="token string">"Image "</span> <span class="token operator"><<</span> idx<span class="token operator">++</span> <span class="token operator"><<</span><span class="token string">" received !!"</span> <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token function">sendServer</span><span class="token punctuation">(</span>ServerManager<span class="token operator">&</span> s<span class="token punctuation">,</span> ModelManager<span class="token operator">&</span> model<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">.</span><span class="token function">send_data_frame</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cout <span class="token operator"><<</span> <span class="token string">"send success!!"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> cout <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token comment">// cout << "send fail!!" << endl;</span> <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ServerManager s<span class="token punctuation">;</span> ModelManager model<span class="token punctuation">;</span> model<span class="token punctuation">.</span><span class="token function">initDetectModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> model<span class="token punctuation">.</span><span class="token function">initClassifyModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cout <span class="token operator"><<</span> endl<span class="token punctuation">;</span> s<span class="token punctuation">.</span><span class="token function">initialization</span><span class="token punctuation">(</span>PORT<span class="token punctuation">)</span><span class="token punctuation">;</span> s<span class="token punctuation">.</span><span class="token function">build_connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> s<span class="token punctuation">.</span><span class="token function">acceptClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> thread <span class="token function">recv_server</span><span class="token punctuation">(</span>recvServer<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> thread <span class="token function">send_server</span><span class="token punctuation">(</span>sendServer<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token function">ref</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> thread <span class="token function">detect</span><span class="token punctuation">(</span><span class="token operator">&</span>ModelManager<span class="token double-colon punctuation">::</span>DetectImg<span class="token punctuation">,</span> <span class="token operator">&</span>model<span class="token punctuation">)</span><span class="token punctuation">;</span> thread <span class="token function">classfy</span><span class="token punctuation">(</span><span class="token operator">&</span>ModelManager<span class="token double-colon punctuation">::</span>ClassifyImg<span class="token punctuation">,</span> <span class="token operator">&</span>model<span class="token punctuation">)</span><span class="token punctuation">;</span> detect<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> classfy<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> recv_server<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> send_server<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>#include <../include/ServerManager.h> #include <../include/ModelManager.h> #include <thread> #define PORT 8080 void recvServer(ServerManager& s, ModelManager& model){ int idx = 0; while (true){ // auto start = std::chrono::steady_clock::now(); cv::Mat frame; s.receive_data_frame(frame, model); // cal time cost // auto end = std::chrono::steady_clock::now(); // std::chrono::duration<double, std::milli> elapsed = end - start; // std::cout << "recv execution time: " << elapsed.count() << " ms\n"; if (frame.empty()) { usleep(2000); continue; } // cv::imwrite("image"+to_string(idx++)+".jpg", frame); std::cout << "Image " << idx++ <<" received !!" << std::endl; } } void sendServer(ServerManager& s, ModelManager& model){ while (true){ if (s.send_data_frame(model)) { cout << "send success!!" << endl; cout << endl; }else{ // cout << "send fail!!" << endl; usleep(2000); } } } int main() { ServerManager s; ModelManager model; model.initDetectModel(); model.initClassifyModel(); cout << endl; s.initialization(PORT); s.build_connect(); s.acceptClient(); thread recv_server(recvServer, std::ref(s), std::ref(model)); thread send_server(sendServer, std::ref(s), std::ref(model)); thread detect(&ModelManager::DetectImg, &model); thread classfy(&ModelManager::ClassifyImg, &model); detect.join(); classfy.join(); recv_server.join(); send_server.join(); return 0; }
python客户端#
<span class="token keyword">import</span> json<span class="token keyword">import</span> socket<span class="token keyword">import</span> struct<span class="token keyword">import</span> time<span class="token keyword">from</span> multiprocessing <span class="token keyword">import</span> JoinableQueue<span class="token keyword">from</span> threading <span class="token keyword">import</span> Thread<span class="token keyword">import</span> os<span class="token keyword">from</span> natsort <span class="token keyword">import</span> ns<span class="token punctuation">,</span> natsortedhost <span class="token operator">=</span> <span class="token string">'192.168.0.2'</span> <span class="token comment"># '192.168.0.2' 'localhost'</span>port <span class="token operator">=</span> <span class="token number">8080</span><span class="token keyword">def</span> <span class="token function">img_encode</span><span class="token punctuation">(</span>img_path<span class="token punctuation">)</span><span class="token punctuation">:</span>img <span class="token operator">=</span> cv2<span class="token punctuation">.</span>imread<span class="token punctuation">(</span>img_path<span class="token punctuation">)</span><span class="token comment"># img = cv2.resize(img, (500, 500), interpolation=cv2.INTER_CUBIC)</span>img_param <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">95</span><span class="token punctuation">]</span> <span class="token comment"># 图片压缩率0-100</span>_<span class="token punctuation">,</span> img <span class="token operator">=</span> cv2<span class="token punctuation">.</span>imencode<span class="token punctuation">(</span><span class="token string">'.jpg'</span><span class="token punctuation">,</span> img<span class="token punctuation">,</span> img_param<span class="token punctuation">)</span>img <span class="token operator">=</span> img<span class="token punctuation">.</span>tobytes<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">return</span> img<span class="token keyword">def</span> <span class="token function">img_product</span><span class="token punctuation">(</span>img_queue<span class="token punctuation">,</span> path<span class="token punctuation">,</span> path_mode<span class="token operator">=</span><span class="token string">'image'</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword">if</span> path_mode <span class="token operator">==</span> <span class="token string">'image'</span><span class="token punctuation">:</span>image <span class="token operator">=</span> img_encode<span class="token punctuation">(</span>path<span class="token punctuation">)</span>img_queue<span class="token punctuation">.</span>put<span class="token punctuation">(</span>image<span class="token punctuation">)</span><span class="token keyword">elif</span> path_mode <span class="token operator">==</span> <span class="token string">'dir'</span><span class="token punctuation">:</span>dir_list <span class="token operator">=</span> os<span class="token punctuation">.</span>listdir<span class="token punctuation">(</span>path<span class="token punctuation">)</span>files <span class="token operator">=</span> natsorted<span class="token punctuation">(</span>dir_list<span class="token punctuation">,</span> alg<span class="token operator">=</span>ns<span class="token punctuation">.</span>PATH<span class="token punctuation">)</span> <span class="token comment"># 顺序读取文件名</span><span class="token keyword">for</span> filename <span class="token keyword">in</span> files<span class="token punctuation">:</span>img_path <span class="token operator">=</span> path <span class="token operator">+</span> <span class="token string">'/'</span> <span class="token operator">+</span> filenameimage <span class="token operator">=</span> img_encode<span class="token punctuation">(</span>img_path<span class="token punctuation">)</span>img_queue<span class="token punctuation">.</span>put<span class="token punctuation">(</span>image<span class="token punctuation">)</span>img_queue<span class="token punctuation">.</span>put<span class="token punctuation">(</span><span class="token string">'E'</span><span class="token punctuation">)</span>img_queue<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">server_consumer</span><span class="token punctuation">(</span>img_queue<span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>start <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token comment"># 1. get img from queue</span>img_obj <span class="token operator">=</span> img_queue<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token punctuation">)</span>img_queue<span class="token punctuation">.</span>task_done<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment"># get end signal</span><span class="token keyword">if</span> img_obj<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'E'</span><span class="token punctuation">:</span>client<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">break</span><span class="token comment"># 2. send package(img_bytes_size, img_bytes)</span>pack_size <span class="token operator">=</span> struct<span class="token punctuation">.</span>pack<span class="token punctuation">(</span><span class="token string">"i"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>img_obj<span class="token punctuation">)</span><span class="token punctuation">)</span>client<span class="token punctuation">.</span>send<span class="token punctuation">(</span>pack_size <span class="token operator">+</span> img_obj<span class="token punctuation">)</span>end <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">)</span>data <span class="token operator">=</span> client<span class="token punctuation">.</span>recv<span class="token punctuation">(</span><span class="token number">65536</span><span class="token punctuation">)</span>json_str <span class="token operator">=</span> data<span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf8'</span><span class="token punctuation">,</span> <span class="token string">'ignore'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token string">b'\x00'</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>results <span class="token operator">=</span> json<span class="token punctuation">.</span>loads<span class="token punctuation">(</span>json_str<span class="token punctuation">)</span>end <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">)</span>end_time <span class="token operator">=</span> time<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">"%Y-%m-%d %H:%M:%S"</span><span class="token punctuation">,</span> time<span class="token punctuation">.</span>localtime<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'send and recv cost time: '</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>end <span class="token operator">-</span> start<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span>client <span class="token operator">=</span> socket<span class="token punctuation">.</span>socket<span class="token punctuation">(</span>socket<span class="token punctuation">.</span>AF_INET<span class="token punctuation">,</span> socket<span class="token punctuation">.</span>SOCK_STREAM<span class="token punctuation">)</span>client<span class="token punctuation">.</span>connect<span class="token punctuation">(</span><span class="token punctuation">(</span>host<span class="token punctuation">,</span> port<span class="token punctuation">)</span><span class="token punctuation">)</span>img_dir <span class="token operator">=</span> <span class="token string">'data'</span>one_img <span class="token operator">=</span> <span class="token string">'./data/image.jpg'</span>mode <span class="token operator">=</span> <span class="token string">'dir'</span>img_jq <span class="token operator">=</span> JoinableQueue<span class="token punctuation">(</span><span class="token punctuation">)</span>producer <span class="token operator">=</span> Thread<span class="token punctuation">(</span>target<span class="token operator">=</span>img_product<span class="token punctuation">,</span> args<span class="token operator">=</span><span class="token punctuation">(</span>img_jq<span class="token punctuation">,</span> img_dir<span class="token punctuation">,</span> mode<span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span>consumer <span class="token operator">=</span> Thread<span class="token punctuation">(</span>target<span class="token operator">=</span>server_consumer<span class="token punctuation">,</span> args<span class="token operator">=</span><span class="token punctuation">(</span>img_jq<span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span>producer<span class="token punctuation">.</span>daemon <span class="token operator">=</span> <span class="token boolean">True</span> <span class="token comment"># set daemon but not set join()</span>producer<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token punctuation">)</span>consumer<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment"># producer.join() // 让生产者先关闭,防止close错误</span>consumer<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">import</span> json <span class="token keyword">import</span> socket <span class="token keyword">import</span> struct <span class="token keyword">import</span> time <span class="token keyword">from</span> multiprocessing <span class="token keyword">import</span> JoinableQueue <span class="token keyword">from</span> threading <span class="token keyword">import</span> Thread <span class="token keyword">import</span> os <span class="token keyword">from</span> natsort <span class="token keyword">import</span> ns<span class="token punctuation">,</span> natsorted host <span class="token operator">=</span> <span class="token string">'192.168.0.2'</span> <span class="token comment"># '192.168.0.2' 'localhost'</span> port <span class="token operator">=</span> <span class="token number">8080</span> <span class="token keyword">def</span> <span class="token function">img_encode</span><span class="token punctuation">(</span>img_path<span class="token punctuation">)</span><span class="token punctuation">:</span> img <span class="token operator">=</span> cv2<span class="token punctuation">.</span>imread<span class="token punctuation">(</span>img_path<span class="token punctuation">)</span> <span class="token comment"># img = cv2.resize(img, (500, 500), interpolation=cv2.INTER_CUBIC)</span> img_param <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">95</span><span class="token punctuation">]</span> <span class="token comment"># 图片压缩率0-100</span> _<span class="token punctuation">,</span> img <span class="token operator">=</span> cv2<span class="token punctuation">.</span>imencode<span class="token punctuation">(</span><span class="token string">'.jpg'</span><span class="token punctuation">,</span> img<span class="token punctuation">,</span> img_param<span class="token punctuation">)</span> img <span class="token operator">=</span> img<span class="token punctuation">.</span>tobytes<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> img <span class="token keyword">def</span> <span class="token function">img_product</span><span class="token punctuation">(</span>img_queue<span class="token punctuation">,</span> path<span class="token punctuation">,</span> path_mode<span class="token operator">=</span><span class="token string">'image'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> path_mode <span class="token operator">==</span> <span class="token string">'image'</span><span class="token punctuation">:</span> image <span class="token operator">=</span> img_encode<span class="token punctuation">(</span>path<span class="token punctuation">)</span> img_queue<span class="token punctuation">.</span>put<span class="token punctuation">(</span>image<span class="token punctuation">)</span> <span class="token keyword">elif</span> path_mode <span class="token operator">==</span> <span class="token string">'dir'</span><span class="token punctuation">:</span> dir_list <span class="token operator">=</span> os<span class="token punctuation">.</span>listdir<span class="token punctuation">(</span>path<span class="token punctuation">)</span> files <span class="token operator">=</span> natsorted<span class="token punctuation">(</span>dir_list<span class="token punctuation">,</span> alg<span class="token operator">=</span>ns<span class="token punctuation">.</span>PATH<span class="token punctuation">)</span> <span class="token comment"># 顺序读取文件名</span> <span class="token keyword">for</span> filename <span class="token keyword">in</span> files<span class="token punctuation">:</span> img_path <span class="token operator">=</span> path <span class="token operator">+</span> <span class="token string">'/'</span> <span class="token operator">+</span> filename image <span class="token operator">=</span> img_encode<span class="token punctuation">(</span>img_path<span class="token punctuation">)</span> img_queue<span class="token punctuation">.</span>put<span class="token punctuation">(</span>image<span class="token punctuation">)</span> img_queue<span class="token punctuation">.</span>put<span class="token punctuation">(</span><span class="token string">'E'</span><span class="token punctuation">)</span> img_queue<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">server_consumer</span><span class="token punctuation">(</span>img_queue<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span> start <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 1. get img from queue</span> img_obj <span class="token operator">=</span> img_queue<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token punctuation">)</span> img_queue<span class="token punctuation">.</span>task_done<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># get end signal</span> <span class="token keyword">if</span> img_obj<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'E'</span><span class="token punctuation">:</span> client<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">break</span> <span class="token comment"># 2. send package(img_bytes_size, img_bytes)</span> pack_size <span class="token operator">=</span> struct<span class="token punctuation">.</span>pack<span class="token punctuation">(</span><span class="token string">"i"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>img_obj<span class="token punctuation">)</span><span class="token punctuation">)</span> client<span class="token punctuation">.</span>send<span class="token punctuation">(</span>pack_size <span class="token operator">+</span> img_obj<span class="token punctuation">)</span> end <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">)</span> data <span class="token operator">=</span> client<span class="token punctuation">.</span>recv<span class="token punctuation">(</span><span class="token number">65536</span><span class="token punctuation">)</span> json_str <span class="token operator">=</span> data<span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf8'</span><span class="token punctuation">,</span> <span class="token string">'ignore'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token string">b'\x00'</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> results <span class="token operator">=</span> json<span class="token punctuation">.</span>loads<span class="token punctuation">(</span>json_str<span class="token punctuation">)</span> end <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">)</span> end_time <span class="token operator">=</span> time<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">"%Y-%m-%d %H:%M:%S"</span><span class="token punctuation">,</span> time<span class="token punctuation">.</span>localtime<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'send and recv cost time: '</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>end <span class="token operator">-</span> start<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span> <span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span> client <span class="token operator">=</span> socket<span class="token punctuation">.</span>socket<span class="token punctuation">(</span>socket<span class="token punctuation">.</span>AF_INET<span class="token punctuation">,</span> socket<span class="token punctuation">.</span>SOCK_STREAM<span class="token punctuation">)</span> client<span class="token punctuation">.</span>connect<span class="token punctuation">(</span><span class="token punctuation">(</span>host<span class="token punctuation">,</span> port<span class="token punctuation">)</span><span class="token punctuation">)</span> img_dir <span class="token operator">=</span> <span class="token string">'data'</span> one_img <span class="token operator">=</span> <span class="token string">'./data/image.jpg'</span> mode <span class="token operator">=</span> <span class="token string">'dir'</span> img_jq <span class="token operator">=</span> JoinableQueue<span class="token punctuation">(</span><span class="token punctuation">)</span> producer <span class="token operator">=</span> Thread<span class="token punctuation">(</span>target<span class="token operator">=</span>img_product<span class="token punctuation">,</span> args<span class="token operator">=</span><span class="token punctuation">(</span>img_jq<span class="token punctuation">,</span> img_dir<span class="token punctuation">,</span> mode<span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span> consumer <span class="token operator">=</span> Thread<span class="token punctuation">(</span>target<span class="token operator">=</span>server_consumer<span class="token punctuation">,</span> args<span class="token operator">=</span><span class="token punctuation">(</span>img_jq<span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span> producer<span class="token punctuation">.</span>daemon <span class="token operator">=</span> <span class="token boolean">True</span> <span class="token comment"># set daemon but not set join()</span> producer<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token punctuation">)</span> consumer<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># producer.join() // 让生产者先关闭,防止close错误</span> consumer<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">)</span>import json import socket import struct import time from multiprocessing import JoinableQueue from threading import Thread import os from natsort import ns, natsorted host = '192.168.0.2' # '192.168.0.2' 'localhost' port = 8080 def img_encode(img_path): img = cv2.imread(img_path) # img = cv2.resize(img, (500, 500), interpolation=cv2.INTER_CUBIC) img_param = [95] # 图片压缩率0-100 _, img = cv2.imencode('.jpg', img, img_param) img = img.tobytes() return img def img_product(img_queue, path, path_mode='image'): if path_mode == 'image': image = img_encode(path) img_queue.put(image) elif path_mode == 'dir': dir_list = os.listdir(path) files = natsorted(dir_list, alg=ns.PATH) # 顺序读取文件名 for filename in files: img_path = path + '/' + filename image = img_encode(img_path) img_queue.put(image) img_queue.put('E') img_queue.join() def server_consumer(img_queue): while True: start = int(round(time.time() * 1000)) # 1. get img from queue img_obj = img_queue.get() img_queue.task_done() # get end signal if img_obj[0] == 'E': client.close() break # 2. send package(img_bytes_size, img_bytes) pack_size = struct.pack("i", len(img_obj)) client.send(pack_size + img_obj) end = int(round(time.time() * 1000)) data = client.recv(65536) json_str = data.decode('utf8', 'ignore').strip(b'\x00'.decode()) results = json.loads(json_str) end = int(round(time.time() * 1000)) end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) print('send and recv cost time: ', (end - start)) print(results) if __name__ == '__main__': client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host, port)) img_dir = 'data' one_img = './data/image.jpg' mode = 'dir' img_jq = JoinableQueue() producer = Thread(target=img_product, args=(img_jq, img_dir, mode,)) consumer = Thread(target=server_consumer, args=(img_jq,)) producer.daemon = True # set daemon but not set join() producer.start() consumer.start() # producer.join() // 让生产者先关闭,防止close错误 consumer.join()
总结#
- 其实这个项目真正做完感觉还是挺简单, 就是对socket通信不太熟悉, 以及传图片没做过.
- 实际上传图片只需要读取图片后,imencode,然后tobytes,最后发送size和data即可.而接受端只需要拼接数组,然后imdecode即可.
- 另外传输结果的话利用json传输可以让结果可读性可高, 传输也比较方便, 当时copy别人的发送代码, 没有细看,导致使用memcpy让json格式乱码,导致无法解码json.
- 如果你感觉接收端没问题,一定要看看发送端.
- 之后的新任务就是视频传输利用rtsp流,敬请期待
参考博客#
- use memcpy in receive_frame function if you want,对应github地址
- a pure client and server code to create a simple demo
- 如果用ctrl+z中断,可能导致address in use,使用bg/fg
- 用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行
- zmq send img
- 优化imdecode速度,本代码未使用
- 视频传输跟图片传输差不多
- Linux c++获取本地毫秒级精确时间
- 如果不想用json,可以试试struct
- 利用json来传输分类结果
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END