【问题标题】:Returning a Opencv Mat type from my Python Code从我的 Python 代码返回 Opencv Mat 类型
【发布时间】: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

任何一位专家都可以帮我解决这个问题。

【问题讨论】:

    标签: python opencv wrapper


    【解决方案1】:

    发帖以防万一有人遇到同样的问题:

    使用 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;
    }
    

    my_lib.i

    %module my_lib
    %include <opencv.i>
    %cv_instantiate_all_defaults
    
    %{
        #include "my_lib.hpp" 
        #include <opencv2/core.hpp>
        #include <iostream>
    %}
    
    %include "my_lib.hpp"
    

    test.py(opencv-swig 库与脚本放在同一文件夹中)

    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
    

    【讨论】:

      【解决方案2】:

      在 c++ 代码中,您使用的是 cv::Mat 数据类型。在 python 中,您也使用 openCV,我可以想象您也希望获得相同的数据类型。 但在 python openCV 中,使用 numpy 数组作为图像格式。

      在下面的链接中,他们谈到了 c++ 下的 numpy 数据格式。我可以想象你使用这种数据格式在 python 和 C++ 之间进行通信。在 C++ 中,您需要进行从 numpy 到 cv::Mat 的转换。

      https://scipy-lectures.github.io/advanced/interfacing_with_c/interfacing_with_c.html

      【讨论】:

      • 我按照你所说的链接,Python - C API 看起来像 SWIG 生成的包装器,所以会感到困惑。你能告诉我如何为我的代码实现包装器。
      • 不,这将花费太长时间。
      • 嗨 Deepfreeze ,我尝试了 python 代码中的一些其他更改,最后将图像的地址从 python 传递到我的 C++ 代码。但我很难从 c++ 中的地址获取图像
      • 你的问题不是很清楚。我从中了解到的是,您现在拥有 c++ 中的 numpy 数据。现在您想知道如何将其放入 cv::Mat 对象中。这可以通过以下内容中的描述来完成:stackoverflow.com/questions/14303073/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多