簡體   English   中英

為什么將cv :: Mat的列復制到向量中會失敗?

[英]Why does copying a column of a cv::Mat into a vector fail?

請考慮以下代碼示例。 為什么下面標記的行在運行時觸發斷點/異常?

int main() {
    Mat m1 = Mat::zeros(10, 1, CV_32FC1);
    Mat m2 = Mat::zeros(10, 3, CV_32FC1);

    vector<float> v1(m1); // works
    Mat m2sub = m2.col(0);
    Mat m2subClone = m2.col(0).clone();
    vector<float> v2(m2subClone); // works
    vector<float> v3(m2sub); // doesn't work
return 0;
}

在mat.hpp中調用的內容似乎很奇怪:

template<typename _Tp> inline Mat::operator std::vector<_Tp>() const {
    std::vector<_Tp> v;
    copyTo(v);
    return v; // <- breaks here
}

和copyTo似乎記憶數據。

它沒有給出錯誤消息,但我在堆棧跟蹤中看到它在return語句處斷開,然后深入到'operator new'和'ntdll.dll!RtlpAllocateHeap()'。

奇怪的是,在我的完整代碼中,它在一個稍微不同的地方中斷:在memcpy的copyTo(v)內部,並拋出“訪問沖突寫入位置0x0000000001F43D4C。”。 我的完整代碼看起來與上面的代碼完全相同,但矩陣更大。

編輯:如果在上面的示例中,我將矩陣更改為

    Mat m1 = Mat::zeros(5900, 1, CV_32FC1);
    Mat m2 = Mat::zeros(5900, 3, CV_32FC1);

由於訪問沖突錯誤,代碼段在與完整代碼相同的位置失敗。

我有超過2GB的RAM免費,並且該應用程序被編譯為64位應用程序,因此它不應該是“內存不足”問題(?)

我不太了解OpenCV Mat類,但我想矩陣中的列有共享的東西,所以記住它可能不是一個好主意。 檢查Mat :: row方法的OpenCV文檔( 這里 ,Mat :: col方法有關於“共享頭”的相同參數),有一個注釋表明以下不是一個好主意

Mat A;
...
A.row(i) = A.row(j); // will not work

並且你應該使用以下代碼:

A.row(j).copyTo(A.row(i));

所以,也許在你的代碼中你應該使用這個:

vector<float> v3;
m2sub.copyTo(v3);

暫無
暫無

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

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