簡體   English   中英

將一行cv :: Mat轉換為std :: vector

[英]Converting a row of cv::Mat to std::vector

我有一個相當簡單的問題:如何獲取一行cv::Mat並獲取std::vector所有數據? cv::Mat包含doubles (對於問題,它可以是任何簡單的數據類型)。

瀏覽OpenCV文檔非常令人困惑,除非我將頁面標記為Googling兩次找不到文檔頁面,其中大部分內容並不容易導航。

我找到了cv::Mat::at(..)來訪問Matrix元素,但我記得從C OpenCV開始,至少有3種不同的方式來訪問元素,所有這些方法都用於不同的目的......可以不記得用於哪個:/

因此,雖然逐個元素復制Matrix肯定會起作用,但我正在尋找一種更有效的方法,如果可能的話,比每行的for循環更優雅一些。

應該這么簡單:

m.row(row_idx).copyTo(v);

其中m是具有CV_64F深度的cv::Mat ,而vstd::vector<double>

OpenCV矩陣中的數據按行主順序排列,因此每行保證是連續的。 這意味着您可以將行中的數據解釋為普通C數組。 以下示例直接來自文檔

// compute sum of positive matrix elements
// (assuming that M is double-precision matrix)
double sum=0;
for(int i = 0; i < M.rows; i++)
{
    const double* Mi = M.ptr<double>(i);
    for(int j = 0; j < M.cols; j++)
        sum += std::max(Mi[j], 0.);
}

因此,最有效的方法是將普通指針傳遞給std::vector

// Pointer to the i-th row
const double* p = mat.ptr<double>(i);

// Copy data to a vector.  Note that (p + mat.cols) points to the
// end of the row.
std::vector<double> vec(p, p + mat.cols);

這肯定比使用begin()end()返回的迭代器更快,因為這些涉及額外的計算以支持行之間的間隙。

這里的文檔中,你可以通過cv::Mat::row得到一個特定的行,它將返回一個新的cv::Mat ,你可以使用cv::Mat::begincv::Mat::end進行迭代cv::Mat::end 因此,以下應該有效:

cv::Mat m/*= initialize */;
// ... do whatever...
cv::Mat first_row(m.row(0));
std::vector<double> v(first_row.begin<double>(), first_row.end<double>());

請注意,我不知道任何OpenCV,但谷歌搜索“OpenCV墊”直接導致基本類型文檔,並據此,這應該工作正常。

矩陣迭代器是隨機訪問迭代器,因此可以將它們傳遞給任何STL算法,包括std :: sort()。

這也來自文檔化,因此您實際上可以在沒有副本的情況下執行此操作:

cv::Mat m/*= initialize */;
// ... do whatever...
// first row          begin              end
std::vector<double> v(m.begin<double>(), m.begin<double>() + m.size().width);

要訪問超過第一行,我建議使用第一個代碼段,因為它會更加清晰,並且似乎沒有任何繁重的復制,因為數據類型似乎是引用計數的。

你也可以使用cv::Rect

m(cv::Rect(0, 0, 1, m.cols)) 

會給你第一排。

matrix(cv::Rect(x0, y0, len_x, len_y);

意味着你將從matrix獲得sub_matrix ,其左上角是(x0,y0) ,大小是(len_x, len_y) (row,col)

我覺得這很有效,

一個例子 :

Mat Input(480, 720, CV_64F, Scalar(100));

裁剪矩陣的第一行:

Rect roi(Point(0, 0), Size(720, 1));

然后:

std::vector<std::vector<double> > vector_of_rows;

vector_of_rows.push_back(Input(roi));

暫無
暫無

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

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