我试图从我的opencv python代码返回(c++ opencv Mat)
我完成的步骤:
A.使用SWIG为我的opencv C++程序生成的.so文件
B.编写了一个示例Opencv Python程序
A.为我的opencv C++代码生成.so:
opencvtest.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int my(Mat image)
{
cv::Mat out;
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
}
cvtColor(image, out,COLOR_BGR2GRAY);
int z=10;
return z;
}
%module opencvtest
%{
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv/cv.h>
extern cv::Mat my(cv::Mat image);
%}
%include "typemaps.i"
%typemap(jstype) cv::Mat& "org.opencv.core.Mat"
%typemap(jstype) cv::Mat "org.opencv.core.Mat"
%typemap(javain) cv::Mat "$javainput.getNativeObjAddr()"
%typemap(javain) cv::Mat& "$javainput.getNativeObjAddr()"
%typemap(jtype) cv::Mat& "long"
%typemap(jni) cv::Mat& "jlong"
extern cv::Mat my(cv::Mat image);
1.swig -c++ -python opencvtest.i
2.g++ -fpic -c opencvtest.cpp opencvtest_wrap.cxx -I/usr/include/python2.7 -I/usr/local/include -I/usr/local/include/opencv -I/usr/local/include/opencv2
3.g++ -shared opencvtest.o opencvtest_wrap.o -o _opencvtest.so -L/usr/local/lib /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgcodecs.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_shape.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videoio.so /usr/local/lib/libopencv_videostab.so
from __future__ import division
import cv2 , numpy
import opencvtest
img = cv2.imread('/home/hubino/Desktop/python/MyPic.jpg')
screen_res = 1280, 720
scale_width = screen_res[0] / img.shape[1]
scale_height = screen_res[1] / img.shape[0]
scale = min(scale_width, scale_height)
window_width = int(img.shape[1] * scale)
window_height = int(img.shape[0] * scale)
res=opencvtest.sample(img)
cv2.imshow('Source Image',img)
cv2.waitKey(0)
cv2.namedWindow('dst_rt', cv2.WINDOW_NORMAL)
cv2.resizeWindow('dst_rt', window_width, window_height)
cv2.imshow('dst_rt', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
最佳答案
发布以防万一有人遇到相同的问题:
使用SWIG和https://github.com/renatoGarcia/opencv-swig处理通过cv::Mat的问题,我最终得到了
my_lib.hpp
#include <opencv2/core.hpp>
#include <iostream>
cv::Mat getImage(cv::Mat& image)
{
std::cout << "image size " << image.rows << " " << image.cols << std::endl;
return image;
}
%module my_lib
%include <opencv.i>
%cv_instantiate_all_defaults
%{
#include "my_lib.hpp"
#include <opencv2/core.hpp>
#include <iostream>
%}
%include "my_lib.hpp"
import my_lib
import cv2
import numpy as np
import sys
sys.path.append('./opencv-swig-master/test/build/')
import mat
img = cv2.imread("test.jpg")
new_img = my_lib.getImage(mat.Mat.from_array(img))
new_img = np.asarray(new_img)
cv2.imwrite("test_out.jpg", new_img)
swig -I<path to opencv-swig-master/lib/> -I<path to opencv2 include folder> -c++ -python my_lib.i
g++ -shared -fpic my_lib_wrap.cxx $(pkg-config --cflags --libs python3) $(pkg-config --libs opencv) -o _my_lib.so
https://stackoverflow.com/questions/28939962/
相关文章:
delphi - 当我尝试安装 Delphi-OpenCV。我得到 "%1 is not a val
python - 使用 Python 和 Matplotlib 将立体图像和深度图转换为 3D 散点
android - javacv和opencv之间的转换以从Mat中获取均值和stdDev
opencv - BackgroundSubtractorMOG2 阴影检测在阳光充足的场景中不起作
python - Spatstat:给定二维点列表,如何将它们连接到多边形中,并进一步使其成为研究区
python-2.7 - 如何提高Python PIL的最终图像质量和清晰度?