3

のクローンを作成するときに segfault が発生しcv::Matます。2 つの関数が呼び出され、m_maskクラスのメンバー変数 (ポインターではない) で機能します。

マスクを設定します。

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

1 に答える 1

6

ヒープの破損がありました...これからの一般的な経験則... cv::Mat がセグメンテーション違反の場合、ヒープのどこかが破損しています。

編集:「どこか」とは、cv::Mat が正しく、使用する関数が正しいと安全に想定できることを意味します。どこかで、おそらくポインターまたはデータ構造のいずれかで、自分でメモリを破損していると安全に想定できます。

于 2013-01-15T19:57:04.817 に答える