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