簡體   English   中英

如何將 C++ 數組轉換為 opencv Mat

[英]How to convert C++ array to opencv Mat

將 C++ 數組轉換為 2D opencv Mat 對象的最快方法是什么? 蠻力方法是遍歷 2D mat 的所有條目並用數組的值填充它們。
有沒有更好/更快的方法來做到這一點? 我可以以某種方式將數組的指針指向二維矩陣嗎?
(我使用的是 opencv 2.4.8)

是的,在cv::Mat文檔中,您可以看到它是如何實現的。

具體在這一行

C++: Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

這意味着你可以做類似的事情

double x[100][100];

cv::Mat A(100, 100, CV_64F, x);

這不會將數據復制到它。 您還必須記住,OpenCV 數據是行主要的,這意味着它具有一行的所有列,然后是下一行,依此類推。 所以你的數組必須匹配這種風格才能工作。

關於它的速度有多快,文檔也談到了它:

data – 指向用戶數據的指針。 接受數據和步驟參數的矩陣構造函數不分配矩陣數據。 相反,它們只是初始化指向指定數據的矩陣頭,這意味着沒有數據被復制。 此操作非常高效,可用於使用 OpenCV 函數處理外部數據。 外部數據不會自動解除分配,因此您應該注意它。

它會工作得非常快,但它是同一個數組,如果你在cv::Mat之外修改它,它將在cv::Mat修改,如果它在任何時候被破壞, cv::Matdata成員cv::Mat將指向一個不存在的地方。

更新:

我也忘了說,您可以創建cv::Mat並執行std::memcpy 這樣它會復制數據,這可能會更慢,但數據將由cv::Mat對象擁有並被cv::Mat銷毀器銷毀。

double x[100][100];
cv::Mat A(100,100,CV_64F);
std::memcpy(A.data, x, 100*100*sizeof(double));
#include <opencv2/opencv.hpp>

int main()
{
    // First row contains 3 white pixels
    // Second row contains 3 black pixels
    uchar temp[2][3] = {{255, 255, 255}, {0, 0, 0}};

    cv::Mat mat = cv::Mat(2, 3, CV_8UC1);
    // The first element of temp decays to int* data.
    // It means that mat.data tracks temp.
    mat.data = temp[0];

    // Change the upper left pixel to black from temp,
    // the change affects mat.
    temp[0][0] = uchar(0);

    cv::namedWindow("title", cv::WINDOW_NORMAL);
    cv::imshow("title", mat);
    cv::waitKey();
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM