上次博客中用python实现了手势识别和手势运动方向的识别,为了将python识别的结果传到用C++写的QT程序中,需要实现python与C++代码通信。
优点:实现起来最简单,稳定,可靠
缺点:迁移运行环境后,需要安装重新部署Python脚本的Python运行环境,非常麻烦。
(1)SOCKET通信
(2)管道
(3)共享文件
(4)共享内存
本文采用socket的方式实现python与C++之间的通信
有关socket的介绍和实现原理可以参考如下链接:
socket原理链接
首先C++客户端给python服务端发送一个字符“1”,然后python接收到字符后打印到终端并再次发送到C++客户端,C++客户端接受的python发送的数据并打印到终端。
python服务端代码:
import socket
import time
if __name__ == '__main__':
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 8888))
server.listen(0)
connection, address = server.accept()
print(connection, address)
num = 0
while True:
# connection, address = server.accept()
# print(connection, address)
recv_str = connection.recv(1024)[0:5]
print("enter 1")
recv_str = recv_str.decode("ascii")
if not recv_str:
break
num = num + 1
print(recv_str, num)
connection.send(bytes("clientRecv: %s," % recv_str, encoding="ascii"))
time.sleep(0.5)
connection.close()
input("enter end")
```
C++客户端代码:
#include
#include
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
#include
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return -1;
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
char* baseCh = { "1" };
for (int clc = 0; clc < 5000; clc++)
{
send(sockClient, baseCh, strlen(baseCh) + 1, 0);
char recvBuf[50];
recv(sockClient, recvBuf, 50, 0);
printf("severRecv %s\n", recvBuf);
//char t[2];
//std::cin >> t;
}
closesocket(sockClient);
WSACleanup();
getchar();
return 0;
}
为了能够实现传输数据的准确性,可以将python代码中的
connection.send(bytes("clientRecv: %s," % recv_str, encoding="ascii"))
替换为:"CD"为传输数据的结束符
DATA = ("clientRecv:" + str(gesture_str) + "CD").encode()
connection.send(DATA)
C++代码中,将下面的代码
char recvBuf[50];
recv(sockClient, recvBuf, 50, 0);
printf("severRecv %s\n", recvBuf);
替换为:
std::string str = "";
char recvBuf[500]; //用于存放python发送的数据
recv(sockClient, recvBuf, 50, 0); //接收数据
str = strtok(recvBuf, "CD"); //CD为数据的结束符,用来分割出有效的数据
std::cout << str << "\n";