2012-12-28 212 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