2015-04-20 35 views
1

我正在圍繞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++層?或者對這個問題有不同的解決方法?任何建議表示讚賞!

回答

3

在你的情況最好的解決方案是使用自定義boost :: python轉換器cv :: Mat對象。 OpenCV有Python包裝器,當你使用這個包裝器時,你正在使用Numpy數組 - 你甚至不需要知道那些數組在「跨越C++ < - > python邊界時被轉換爲cv :: Mat對象」。編寫這種簡單類型的轉換器非常簡單,但是爲cv :: Mat創建轉換器並不簡單。幸運的是,其他人已經這樣做了 - here是OpenCV 2.x和here的3.x版本。如果你不熟悉boost :: python轉換器,this article應該可以幫到你。
希望它有幫助,如果你有任何問題,請告訴我們。

+0

非常感謝,看起來像我正在尋找! – meandrobo