2012-12-28 131 views
1

克隆cv::Mat時出現段錯誤。兩個函數被調用,並在m_mask工作,我的類的成員變量(不是指針):cv ::: Mat克隆段錯誤

設置屏蔽:

void SetMask(QImage mask) 
{ 
    if(!mask.isNull() && mask.depth() == 1) 
    { 
     std::cout << "Mask width: " << mask.width() << " and mask height: " << mask.height() << std::endl << std::flush; 
     if(mask.width() != m_mask.cols || mask.height() != m_mask.rows) 
      m_mask.create(mask.height(), mask.width(), CV_8UC1); 

     if(m_mask.data == 0) 
      std::cout << "MALLOC FAILED" << std::endl << std::flush; 

     //Copy data here 

     cv::imshow("OpenCV Image", m_mask); 
    } 
    else 
     m_mask = cv::Scalar(0); 
} 

然後用面膜:

QString MaskToXML() 
{ 
    QString xml_out; 
    if(!m_mask.empty()) 
    { 
     cv::Mat workspace = m_mask.clone(); //Clone our mask - SEGFAULT HERE 

     //Run the contour code 
     std::vector< std::vector<cv::Point> > contours; 
     cv::findContours(workspace, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 

     //do stuff 
    } 
    return xml_out; 
} 
+0

調試器說了什麼? –

+0

這是最糟糕的部分,我無法從調試器中找到任何信息。我編譯OpenCV並沒有用調試符號編譯它......事實上,我只是想出了我的問題是什麼......它必須通過代碼來處理我的拷貝數據......我認爲它是正確的,但它不是。我需要更新這個問題。 – Constantin

+0

你有沒有試過Mat :: copyTo而不是克隆?它不回答你的問題,但也許它可能是一種解決方法。 – SMK

回答

2

我堆腐敗...從現在起我的一般經驗法則...如果cv :: Mat是segfaulting,我損壞了堆的地方。

編輯:「某處」,我的意思是你可以安全地假設cv :: Mat是正確的,它使用的函數是正確的。你可以放心地假設你正在自己的某處破壞內存,可能是在你的指針或數據結構之一。

+0

+1這是非常好的建議 – qwerty9967

+0

@Constantin:你可以請解釋堆腐敗....我在'copyTo()'和'clone()'期間面臨相同的分段錯誤 – skm

+0

腐敗是在另一個數據結構,它轉化爲破壞分配的內存在cv: :墊。你的問題在於與cv :: Mat沒有關係的代碼,但是在你處理指針/動態內存的地方。 – Constantin