調べたこと、作ったことをメモしています。
こちらに移行中: https://blog.shimazu.me/

Qt: QImageのimplicit sharingによる被害

cv::MatからQImageに変換する関数を作ったときに、implicit sharingによる被害を被ったので書いておく。

QImage *BlinkAnalizer::createQImage(const cv::Mat &img)
{
    if (img.empty()) {
        qWarning() << "toQImage: image is empty";
        return (new QImage);
    }
    // QImage内部で共有されるので、ポインタの必要がある。
    cv::Mat *dst = new cv::Mat;
    cv::cvtColor(img, *dst, CV_RGB2BGR);
    QImage *tmp = new QImage ((uchar *)dst->data, dst->cols, dst->rows,
                             dst->step, QImage::Format_RGB888);
    return tmp;
}

途中で保持していたcv::Mat dstを、ポインタに変えたところうまくいった。 QImageのコンストラクタでコピーするイメージをなぜか持ってしまっていたので、これによって生成したQImageに対してcopyメソッドをつかったときに死ぬということに悩んでしまった。しかもisNullメソッドとかは普通に動くし、しかもNullじゃないと言ってくるっていう。