我正在圍繞ArUco增強現實庫(基於OpenCV)編寫一個薄包裝器。我試圖構建的界面非常簡單:從NumPy陣列到Mat(OpenCV)的C++轉換
- 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++層?或者對這個問題有不同的解決方法?任何建議表示讚賞!
非常感謝,看起來像我正在尋找! – meandrobo