【发布时间】:2015-03-09 10:40:22
【问题描述】:
我尝试从我的 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;
}
opencvtest.i
%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);
完成以下命令,为我的 C++ 程序成功生成 .so 文件:
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
B.编写了一个示例 Opencv Python 程序以返回一个 opencv c++ Mat:
Sample.py
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()
当我尝试在我的机器上执行 sample.py 时出现此错误
Traceback(最近一次调用最后一次): 文件“sample1.py”,第 15 行,在 res=opencvtest.my(img) TypeError:在方法'my'中,'cv::Mat'类型的参数1
任何一位专家都可以帮我解决这个问题。
【问题讨论】: