2012-12-28 3 views
1

Je reçois un segfault lors du clonage d'un cv::Mat. Deux fonctions sont appelées, et travaillent sur m_mask une variable membre (pas un pointeur) de ma classe:cv ::: Mat clone Segfault

Définissez le masque:

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); 
} 

utiliser le masque:

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

Qu'a dit le débogueur? –

+0

C'est la pire partie, je ne trouve aucune information du débogueur. J'ai compilé OpenCV et je ne l'ai pas compilé avec des symboles de débogage ... En fait, je viens de comprendre quel est mon problème ... Cela a à voir avec mes données de copie sur le code .. Je pensais que c'était correct. Je dois mettre à jour la question. – Constantin

+0

Avez-vous essayé Mat :: copyTo au lieu de cloner? Cela ne répond pas à votre question, mais peut-être que ce pourrait être une solution de contournement. – SMK

Répondre

2

j'avais une corruption de tas ... règle générale pour moi à partir de maintenant ... Si cv :: Mat est une erreur de segmentation, j'ai corrompu le tas quelque part. Edit: Par "quelque part", je voulais dire que vous pouvez supposer que cv :: Mat est correct et que les fonctions qu'il utilise sont correctes. Vous pouvez sans risque supposer que vous corrompez la mémoire quelque part par vous-même, probablement à l'un de vos pointeurs ou structures de données.

+0

+1 c'est un très bon conseil – qwerty9967

+0

@Constantin: pourriez-vous s'il vous plaît expliquer sur la corruption de tas .... Je suis confronté à la même erreur de segmentation pendant 'copyTo()' et 'clone()' – skm

+0

La corruption était sur une autre structure de données, qui s'est traduite par corrompre la mémoire allouée dans le cv: :Tapis. Votre problème réside dans le code non lié à cv :: Mat, mais quelque part où vous avez affaire à des pointeurs/mémoire dynamique. – Constantin