我正在围绕 ArUco 增强现实库(基于 OpenCV)编写一个薄包装器。我试图构建的界面非常简单:
- Python 将图像传递给 C++ 代码;
- C++ 代码检测标记并将其位置和其他信息作为字典元组返回给 Python。
但是,我不知道如何在 Python 中表示图像以将其传递给 C++。对于 GUI 和相机管理,我将使用 PyQt,所以最初它将是 QImage,但我不能简单地将它传递给 OpenCV(或者我可以?)。起初,我尝试使用嵌套元组来表示每个像素的行、列和颜色,所以我最终得到了以下示例代码:
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++ 层?或者也许有不同的方法来解决这个问题?任何建议表示赞赏!