python和C++共享內(nèi)存?zhèn)鬏攬D像的示例
原理
python沒有辦法直接和c++共享內(nèi)存交互,需要間接調(diào)用c++打包好的庫來實(shí)現(xiàn)
流程
- C++共享內(nèi)存打包成庫
- python調(diào)用C++庫往共享內(nèi)存存圖像數(shù)據(jù)
- C++測(cè)試代碼從共享內(nèi)存讀取圖像數(shù)據(jù)
實(shí)現(xiàn)
1.c++打包庫
創(chuàng)建文件

example.cpp
#include <iostream>
#include <cassert>
#include <stdlib.h>
#include <sys/shm.h>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#define key 650
#define image_size_max 1920*1080*3
using namespace std;
using namespace cv;
typedef struct{
int rows;
int cols;
uchar dataPointer[image_size_max];
}image_head;
int dump(int cam_num,int row_image, int col_image, void* block_data_image)
{
int shm_id = shmget(key+cam_num,sizeof(image_head),IPC_CREAT);
if(shm_id == -1)
{
cout<<"shmget error"<<endl;
return -1;
}
cout << " shem id is "<<shm_id<<endl;
image_head *buffer_head;
buffer_head = (image_head*) shmat(shm_id, NULL, 0);
if((long)buffer_head == -1)
{
cout<<"Share memary can't get pointer"<<endl;
return -1;
}
assert(row_image*col_image*3<=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;
for (int i=0;i<row_image*col_image*3;i++)
{
image_dumper.dataPointer[i] = *ptr_tmp_image;
ptr_tmp_image++;
}
memcpy(buffer_head,&image_dumper,sizeof(image_dumper));
return 1;
}
extern "C"
{
int dump_(int cam_num,int row_image, int col_image, void* block_data_image)
{
int result=dump(cam_num,row_image, col_image, block_data_image);
return result;
}
}
CMakeLists.txt
# cmake needs this line
cmake_minimum_required(VERSION 2.8)
# Define project name
project(opencv_example_project)
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
if(CMAKE_VERSION VERSION_LESS "2.8.11")
# Add OpenCV headers location to your include paths
include_directories(${OpenCV_INCLUDE_DIRS})
endif()
# Declare the executable target built from your sources
add_library(opencv_example SHARED example.cpp)
add_executable(test_example test_run.cpp)
# Link your application with OpenCV libraries
target_link_libraries(opencv_example ${OpenCV_LIBS})
target_link_libraries(test_example ${OpenCV_LIBS})
最后生成庫

2.python調(diào)用C++動(dòng)態(tài)庫進(jìn)行存圖
#!/usr/bin/env python
import sys
#sys.path.append("/usr/lib/python3/dist-packages")
#sys.path.append("/home/frank/Documents/215/code/parrot-groundsdk/.python/py3/lib/python3.5/site-packages")
import cv2
import ctypes
import numpy as np
ll = ctypes.cdll.LoadLibrary
lib = ll("./build/libopencv_example.so")
lib.dump_.restype = ctypes.c_int
count = 1
#path = "/home/frank/Documents/215/2020.10.24/python_ctypes/image/"
while count < 30:
path = "./image/"+str(count)+".jpg"
print(path)
image=cv2.imread(path)
#cv2.imshow("test",image)
#cv2.waitKey(0)
image_data = np.asarray(image, dtype=np.uint8)
image_data = image_data.ctypes.data_as(ctypes.c_void_p)
value = lib.dump_(0,image.shape[0], image.shape[1], image_data)
print(value)
count += 1
if count == 30:
count = 1
3.C++讀取共享內(nèi)存獲取圖像
#include <iostream>
#include <stdlib.h>
#include <sys/shm.h>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#define key 650
#define image_size_max 1920*1080*3
using namespace cv;
using namespace std;
typedef struct{
int rows;
int cols;
uchar dataPointer[image_size_max];
}image_head;
int main()
{
int count = 1;
while(true)
{
int shm_id = shmget(key+0,sizeof(image_head) ,IPC_CREAT);
if(shm_id == -1)
{
cout<<"shmget error"<<endl;
return -1;
}
cout << " shem id is "<<shm_id<<endl;
image_head* buffer_head;
buffer_head = (image_head*)shmat(shm_id, NULL, 0);
if((long)buffer_head == -1)
{
perror("Share memary can't get pointer\n");
return -1;
}
image_head image_dumper;
memcpy(&image_dumper, buffer_head, sizeof(image_head));
cout<<image_dumper.rows<<" "<<image_dumper.cols<<endl;
uchar* data_raw_image=image_dumper.dataPointer;
cv::Mat image(image_dumper.rows, image_dumper.cols, CV_8UC3);
uchar* pxvec =image.ptr<uchar>(0);
int count = 0;
for (int row = 0; row < image_dumper.rows; row++)
{
pxvec = image.ptr<uchar>(row);
for(int col = 0; col < image_dumper.cols; col++)
{
for(int c = 0; c < 3; c++)
{
pxvec[col*3+c] = data_raw_image[count];
count++;
}
}
}
cv::imshow("Win",image);
cv::waitKey(1);
}
return 1;
}
以上就是python和C++共享內(nèi)存?zhèn)鬏攬D像的示例的詳細(xì)內(nèi)容,更多關(guān)于python和c++傳輸圖像的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于wxPython的GUI實(shí)現(xiàn)輸入對(duì)話框(2)
這篇文章主要為大家詳細(xì)介紹了基于wxPython的GUI實(shí)現(xiàn)輸入對(duì)話框的第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
python自動(dòng)化測(cè)試selenium核心技術(shù)等待條件教程
這篇文章主要為大家介紹了python自動(dòng)化測(cè)試selenium核心技術(shù)等待條件教程的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Python小游戲?qū)崿F(xiàn)實(shí)例之接蘋果
其實(shí)利用Python編寫的小游戲很簡單,下面這篇文章主要給大家介紹了關(guān)于Python小游戲?qū)崿F(xiàn)實(shí)例之接蘋果的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
python使用urllib2實(shí)現(xiàn)發(fā)送帶cookie的請(qǐng)求
這篇文章主要介紹了python使用urllib2實(shí)現(xiàn)發(fā)送帶cookie的請(qǐng)求,涉及Python操作cookie的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
使用Python爬蟲庫BeautifulSoup遍歷文檔樹并對(duì)標(biāo)簽進(jìn)行操作詳解
今天為大家介紹下Python爬蟲庫BeautifulSoup遍歷文檔樹并對(duì)標(biāo)簽進(jìn)行操作的詳細(xì)方法與函數(shù)2020-01-01
python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解
今天小編就為大家分享一篇對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06

