python和c++如何实现共享内存传输图像

  介绍

这期内容当中小编将会给大家带来有关python和c++如何实现共享内存传输图像,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现

    <李> c++共享内存打包成库李 <>李python调用c++库往共享内存存图像数据李 <>李c++测试代码从共享内存读取图像数据李

<强> 1。c++打包库

创建文件

 python和c++如何实现共享内存传输图像

的例子。cpp

 # include & lt; iostream>
  # include & lt; cassert>
  # include & lt; stdlib.h>
  # include & lt; sys/shm.h>
  # include“opencv2/core.hpp"
  # include“opencv2/imgproc.hpp"
  # include“opencv2/highgui.hpp"
  # include“opencv2/videoio.hpp"
  ,
  #定义关键650
  #定义image_size_max 1920 * 1080 * 3
  ,
  使用名称空间性病;
  使用名称空间的简历;
  ,
  typedef struct {
  int行;
  整数关口;
  uchar数据(image_size_max);
  }image_head;
  ,
  int转储(int, int row_image int cam_num col_image, void * block_data_image)
  {
  ,,int shm_id=shmget(键+ cam_num sizeof (image_head) IPC_CREAT);
  ,,如果(shm_id==1)
  ,,{
  ,,,,cout<& lt;“shmget error" & lt; & lt; endl;
  ,,,,,返回1;
  ,,}
  ,,cout & lt; & lt;“;闪id is “& lt; & lt; shm_id<& lt; endl;
  ,
  ,,image_head * buffer_head;
  ,,buffer_head=(image_head *)调用shmat (shm_id零0);
  ,
  ,,如果((长)buffer_head==1)
  ,,{
  ,,,,cout<& lt;“分享memary停下来# 39;t pointer" & lt; & lt; endl;,
  ,,,,,返回1,,
  ,,}
  ,,,,
  ,才能维护(row_image * col_image * 3 & lt;=image_size_max);
  ,,image_head image_dumper;
  ,,image_dumper.rows=row_image;
  ,,image_dumper.cols=col_image;
  ,,uchar * ptr_tmp_image=(uchar *) block_data_image;
  ,,(int i=0; i< row_image * col_image * 3;我+ +)
  ,,{
  ,,,,image_dumper。数据[我]=* ptr_tmp_image;
  ,,,,,ptr_tmp_image + +;
  ,,}
  ,,memcpy (buffer_head, image_dumper, sizeof (image_dumper));
  ,,,,
  ,,返回1;
  }
  ,
  外来的“C"
  {
  int dump_才能(int, int row_image int cam_num col_image, void * block_data_image)
  {才能
  ,,,int结果=转储(cam_num, row_image, col_image block_data_image);
  ,,,返回结果;
  ,,}
  }

CMakeLists。txt

 # cmake需要这条线
  cmake_minimum_required(版本2.8)
  ,
  #定义项目名称
  项目(opencv_example_project)
  ,
  #发现OpenCV,你可能需要设置OpenCV_DIR变量
  #包含OpenCVConfig目录的绝对路径。cmake文件
  #通过命令行或GUI
  find_package (OpenCV需要)
  ,
  #如果包被发现,几个变量
  #设置,你可以找到完整的描述
  OpenCVConfig #。cmake文件。
  #打印一些信息显示
  消息(状态“OpenCV图书馆现状:“)
  消息(状态“,,,,版本:$ {OpenCV_VERSION}“)
  消息(状态“,,,,库:$ {OpenCV_LIBS}“)
  消息(状态“,,,,包括路径:$ {OpenCV_INCLUDE_DIRS}“)
  ,
  如果(CMAKE_VERSION VERSION_LESS“2.8.11")
  #才能添加OpenCV头位置包括路径
  include_directories才能($ {OpenCV_INCLUDE_DIRS})
  endif ()
  ,
  #声明可执行目标由你的创意来源
  add_library (opencv_example 共享example.cpp)
  add_executable (test_example test_run.cpp)
  ,
  #与OpenCV库链接您的应用程序
  target_link_libraries (opencv_example $ {OpenCV_LIBS})
  target_link_libraries (test_example $ {OpenCV_LIBS}) 

最后生成库

 python和c++如何实现共享内存传输图像

<强> 2。python调用c++动态库进行存图

# !/usr/bin/env python   ,   导入系统   ,   # sys.path.append (“/usr/lib/python3/dist-packages")   # sys.path.append (“/home/弗兰克/文档/215/代码/parrot-groundsdk/.python py3/lib/python3.5/site-packages")   ,   进口cv2   进口ctypes   进口numpy np   你=ctypes.cdll.LoadLibrary   自由=会(“。/构建/libopencv_example.so")   lib.dump_。restype=ctypes.c_int   ,   数=1=#路径“/home/弗兰克/文件/215/2020.10.24/python_ctypes/图像/?   ,   而数& lt;30:   ,,,=奥肪丁?图像/? str(数)+“.jpg"   ,,,print(路径)   ,,,形象=cv2.imread(路径)   ,,,,   ,,,# cv2.imshow (“test"、图片)   ,,,# cv2.waitKey (0)   ,   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

python和c++如何实现共享内存传输图像