[英]send image opencv c++ to python
我用python打開圖片,發給C++function處理,返回圖片。 如何從 c ++ function 正確獲取圖片?
代碼示例:
// t_lib.cpp
#include "opencv2/opencv.hpp"
extern "C" unsigned char* getfg(int rows,int cols, unsigned char* fdata)
//extern "C" void getfg(int rows,int cols, unsigned char* fdata)
{
cv::Mat frame = cv::Mat(rows, cols, CV_8UC3, (void *) fdata);
// Work
//cv::imshow("Display window C++", frame);
//cv::waitKey(0);
// do something
return frame.data; //fdata;
}
# test.py
import cv2
import numpy as np
import ctypes
lib = ctypes.cdll.LoadLibrary('./lib.so')
def getfg(img):
ptr = lib.getfg(img.shape[0], img.shape[1], img.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)))
buf = (ctypes.c_ubyte * img.shape[0] * img.shape[1] * 3).from_address(ptr)
res = np.ndarray(buffer=buf, dtype=np.uint8, shape=(img.shape[0], img.shape[1], 3), order="C")
return res
f = cv2.imread("sample.jpg")
#gray_image = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
AS = getfg(f)
print AS.shape
#np.array(AS)[0]
cv2.imshow("Window Python", AS)
cv2.waitKey(0)
匯編:
g++ -c -fPIC t_lib.cpp -o lib -lX11 $(pkg-config opencv --cflags --libs) -I/usr/include/python2.7 -I/usr/lib/python2.7;
g++ -shared -Wl,-soname,lib.so -o lib.so lib -lopencv_core -lopencv_highgui -lopencv_imgproc
查看 opencv 庫的命令:
pkg-config opencv --cflags --libs
output:
-I/usr/include/opencv -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core
版本 c++ OpenCV 3.2.0
你必須編譯該C ++代碼到一個共享庫,根據本然后寫一個包裝
python3.x
main.py
import cv2
import numpy as np
import ctypes
cv_lib = ctypes.CDLL("./cpp_function.so")
def opencv_cpp_operation(im):
ND_POINTER_1 = np.ctypeslib.ndpointer(dtype=np.float64,
ndim=im.ndim,
flags="C")
cv_lib.opencv_op.argtypes = [ND_POINTER_1,ctypes.c_size_t]
cv_lib.opencv_op.restype = np.ctypeslib.ndpointer(dtype=np.float64, ndim=im.ndim, shape=im.shape, flags="C")
ret_img = cv_lib.opencv_op(im, *im.shape, im.shape[0] * im.shape[1])
return ret_img
im = cv2.imread("./imagepath.jpg", 0)
np_array = opencv_cpp_operation(im)
c++
cpp_function.cpp
編譯使用g++ -shared -fPIC cpp_function.cpp -o cpp_function.so -I /usr/include/opencv4/ -L /usr/lib -lopencv_core -lopencv_imgproc
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
extern "C" {
double* opencv_op(double *a1, size_t a1_h, size_t a1_w, int size){
cv::Mat A(a1_h,a1_w,CV_64F);
std::memcpy(A.data, a1, a1_h*a1_w*sizeof(double));
// Now use Mat A for your processing than return it python
cv::Mat C(a1_h,a1_w,CV_64F);
C = A * 2;
double* ret_arr = new double[size];
std::memcpy(ret_arr, C.data, a2_h*a2_w*sizeof(double));
return ret_arr;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.