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じゃないと言ってくるっていう。