DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

C++

main.cpp

 
 
#include<iostream>
 
#include<vector>
 
#include<opencv2/opencv.hpp>
 
#include<pybind11/pybind11.h>
 
#include<pybind11/numpy.h>
 
#include<pybind11/stl.h>
 
#include"mat_warper.h"
 
 
 
namespace py = pybind11;
 
 
 
py::array_t<unsigned char> test_rgb_to_gray(py::array_t<unsigned char>& input) {
 
 
 
cv::Mat img_rgb = numpy_uint8_3c_to_cv_mat(input);
 
cv::Mat dst;
 
cv::cvtColor(img_rgb, dst, cv::COLOR_RGB2GRAY);
 
return cv_mat_uint8_1c_to_numpy(dst);
 
 
 
}
 
 
 
py::array_t<unsigned char> test_gray_canny(py::array_t<unsigned char>& input) {
 
cv::Mat src = numpy_uint8_1c_to_cv_mat(input);
 
cv::Mat dst;
 
cv::Canny(src, dst, 30, 60);
 
return cv_mat_uint8_1c_to_numpy(dst);
 
}
 
 
 
 
 
/*
 
@return Python list
 
*/
 
py::list test_pyramid_image(py::array_t<unsigned char>& input) {
 
cv::Mat src = numpy_uint8_1c_to_cv_mat(input);
 
std::vector<cv::Mat> dst;
 
 
 
cv::buildPyramid(src, dst, 4);
 
 
 
py::list out;
 
for (int i = 0; i < dst.size(); i++)
 
{
 
out.append<py::array_t<unsigned char>>(cv_mat_uint8_1c_to_numpy(dst.at(i)));
 
}
 
 
 
return out;
 
}
 
 
 
PYBIND11_MODULE(cv_demo1, m) {
 
 
 
m.doc() = "Simple opencv demo";
 
 
 
m.def("test_rgb_to_gray", &test_rgb_to_gray);
 
m.def("test_gray_canny", &test_gray_canny);
 
m.def("test_pyramid_image", &test_pyramid_image);
 
 
 
}
 
 

mat_warper.h

 
 
#ifndef MAT_WARPER_H_
 
 
 
#include<opencv2/opencv.hpp>
 
#include<pybind11/pybind11.h>
 
#include<pybind11/numpy.h>
 
 
 
namespace py = pybind11;
 
 
 
cv::Mat numpy_uint8_1c_to_cv_mat(py::array_t<unsigned char>& input);
 
 
 
cv::Mat numpy_uint8_3c_to_cv_mat(py::array_t<unsigned char>& input);
 
 
 
py::array_t<unsigned char> cv_mat_uint8_1c_to_numpy(cv::Mat & input);
 
 
 
py::array_t<unsigned char> cv_mat_uint8_3c_to_numpy(cv::Mat & input);
 
 
 
#endif // !MAT_WARPER_H_
 
 

mat_warper.cpp

 
 
#include"mat_warper.h"
 
#include <pybind11/numpy.h>
 
 
 
/*
 
Python->C++ Mat
 
*/
 
 
 
 
 
cv::Mat numpy_uint8_1c_to_cv_mat(py::array_t<unsigned char>& input) {
 
 
 
if (input.ndim() != 2)
 
throw std::runtime_error("1-channel image must be 2 dims ");
 
 
 
py::buffer_info buf = input.request();
 
 
 
cv::Mat mat(buf.shape[0], buf.shape[1], CV_8UC1, (unsigned char*)buf.ptr);
 
 
 
return mat;
 
}
 
 
 
 
 
cv::Mat numpy_uint8_3c_to_cv_mat(py::array_t<unsigned char>& input) {
 
 
 
if (input.ndim() != 3)
 
throw std::runtime_error("3-channel image must be 3 dims ");
 
 
 
py::buffer_info buf = input.request();
 
 
 
cv::Mat mat(buf.shape[0], buf.shape[1], CV_8UC3, (unsigned char*)buf.ptr);
 
 
 
return mat;
 
}
 
 
 
 
 
/*
 
C++ Mat ->numpy
 
*/
 
py::array_t<unsigned char> cv_mat_uint8_1c_to_numpy(cv::Mat& input) {
 
 
 
py::array_t<unsigned char> dst = py::array_t<unsigned char>({ input.rows,input.cols }, input.data);
 
return dst;
 
}
 
 
 
py::array_t<unsigned char> cv_mat_uint8_3c_to_numpy(cv::Mat& input) {
 
 
 
py::array_t<unsigned char> dst = py::array_t<unsigned char>({ input.rows,input.cols,3}, input.data);
 
return dst;
 
}
 
 
 
 
 
 
 
//PYBIND11_MODULE(cv_mat_warper, m) {
 
//
 
// m.doc() = "OpenCV Mat -> Numpy.ndarray warper";
 
//
 
// m.def("numpy_uint8_1c_to_cv_mat", &numpy_uint8_1c_to_cv_mat);
 
// m.def("numpy_uint8_1c_to_cv_mat", &numpy_uint8_1c_to_cv_mat);
 
//
 
//
 
//}
 
 

Python调用

 
 
import cv2
 
import matplotlib.pyplot as plt
 
import demo11.cv_demo1 as cv_demo1
 
import numpy as np
 
 
 
 
 
image_rgb = cv2.imread('F:\\lena\\lena_rgb.jpg', cv2.IMREAD_UNCHANGED)
 
image_gray = cv2.imread('F:\\lena\\lena_gray.jpg', cv2.IMREAD_UNCHANGED)
 
 
 
var1 = cv_demo1.test_rgb_to_gray(image_rgb)
 
print(var1.shape)
 
plt.figure('rgb-gray')
 
plt.imshow(var1, cmap=plt.gray())
 
 
 
var2 = cv_demo1.test_gray_canny(image_gray)
 
plt.figure('canny')
 
plt.imshow(var2, cmap=plt.gray())
 
 
 
var3 = cv_demo1.test_pyramid_image(image_gray)
 
var3 = var3[1:]
 
plt.figure('pyramid_demo')
 
for i, image in enumerate(var3, 1):
 
plt.subplot(2, 2, i)
 
plt.axis('off')
 
plt.imshow(image, cmap=plt.gray())
 
 
 
plt.show()
 
 

ref:

Linux下编译安装OpenCV(基于C++,生成so库供python调用)

https://blog.csdn.net/non_hercules/article/details/105095153

posted on 2022-08-24 19:38  DoubleLi  阅读(461)  评论(0)    收藏  举报