我正在编写一个ArUco增强现实库的轻量级封装(基于OpenCV)。我试图构建的接口非常简单:
- Python将图像传递给C++代码;
- C++代码检测标记并将它们的位置和其他信息作为字典元组返回给Python。
using namespace cv;
namespace py = boost::python;
void display(py::tuple pix)
{
/*
Receive image from Python and display it.
*/
Mat img(py::len(pix), py::len(pix[0]), CV_8UC3, Scalar(0, 0, 255));
for (int y = 0; y < py::len(pix); y++)
for (int x = 0; x < py::len(pix[y]); x++)
{
Vec3b rgb;
for (int i = 0; i < 3; i++)
rgb[i] = py::extract<int>(pix[y][x][i]);
img.at<Vec3b>(Point(x, y)) = rgb;
}
imshow("Image", img);
waitKey(0);
}
BOOST_PYTHON_MODULE(aruco)
{
py::def("display", display);
}
结果发现运行速度非常缓慢(每帧需要几秒钟),于是我进行了谷歌搜索并找到了一种更快的解决方案:使用NumPy数组,这样代码将会变成下面这个样子:
void display(py::object array)
{
Mat img;
// ... some magic here to convert NumPy array to Mat ...
imshow("Image", img);
waitKey(0);
}
然而,我不知道如何将NumPy数组(在C++级别上只是Python对象)转换为OpenCV Mat。希望能得到任何帮助。
另外,也许不需要使用NumPy,可以直接将QImage Python对象传递给C++层?或者可能有不同的解决方法吗?感谢您的任何建议!