利用socket实现C++与python的通信,实现手势识别结果的传输。

利用socket实现C++与python的通信,实现手势识别结果的传输。

     上次博客中用python实现了手势识别和手势运动方向的识别,为了将python识别的结果传到用C++写的QT程序中,需要实现python与C++代码通信。

1.实现方法

(1)C/C++里调用Python脚本函数

优点:实现起来最简单,稳定,可靠
缺点:迁移运行环境后,需要安装重新部署Python脚本的Python运行环境,非常麻烦。

(2)将Python打包成独立进程,C/C++于Python实现进程间通信,有以下几种方式:

(1)SOCKET通信

(2)管道

(3)共享文件

(4)共享内存

     本文采用socket的方式实现python与C++之间的通信

2.使用的IDE

python使用pycharm进行编写、调试代码,C++使用Visual Studio 2015进行编写、调试代码。

3.代码测试

     有关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;
}

4.测试效果图片

利用socket实现C++与python的通信,实现手势识别结果的传输。_第1张图片

5.改进

为了能够实现传输数据的准确性,可以将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";  

6.最终与上一篇的手势识别相结合,实现如下效果:

这个代码也随后分享,谢谢观看!
利用socket实现C++与python的通信,实现手势识别结果的传输。_第2张图片
利用socket实现C++与python的通信,实现手势识别结果的传输。_第3张图片

你可能感兴趣的:(学习经验分享,c++,python,socket,人工智能,多进程)