2016-08-26 15 views
0

OpenCVを使ってカメラの画像をキャプチャし、QtにQLabelとして表示しようとしています。私が見つけたガイドに従えば、これはある程度機能します。しかし、QImageを作成してPixmapを設定する前にマットのサイズを変更しようとすると、アプリケーションがただちにクラッシュします。クラッシュは「CameraSoftware.exeが動作を停止しました」というタイプのため、クラッシュする場所を特定する以外にはデバッグするのが難しいです。OpenCVの画像が大きすぎるとQtがクラッシュする

環境は、QtCreator 3.6.0(Qt 5.5.1)およびOpenCV 3.10を使用した64ビットウィンドウです。

ここではコードの重要なビットです:これはQLabelウィジェットに返送され

void VideoStreamOpenCVWorker::receiveGrabFrame() 
{ 
    if(!toggleStream) return; 

    (*cap) >> frameOriginal; 
    if(frameOriginal.empty()) return; 

    process(); 

    qDebug() << frameProcessed.cols << "x" << frameProcessed.rows; 

    QImage output((const unsigned char *) frameProcessed.data, frameProcessed.cols, frameProcessed.rows, QImage::Format_RGBA8888); 

    emit sendFrame(output); 
} 


void VideoStreamOpenCVWorker::process() 
{ 
    cv::cvtColor(frameOriginal, frameProcessed, cv::COLOR_BGR2RGBA); 
    cv::Size size(641,481); 
    cv::resize(frameProcessed, frameProcessed, size); 
} 

:それは "setpixmap" の行には、具体的にクラッシュする場所

void VideoStreamWidget::receiveFrame(QImage frame){ 
    this->setPixmap(QPixmap::fromImage(frame)); 
} 

これがあります。

Qlabelは単にでQMainWindowに追加されます:オリジナルキャップ絵が何らかの理由で640×480である

QVBoxLayout *pictureLayout = new QVBoxLayout; 
VideoStreamWidget *video = new VideoStreamWidget(); 
pictureLayout->addWidget(video); 

、私が使用しているカメラはフルHDカメラです。これを引き起こす原因は何ですか?私が望むならば私は大きな画像を直接加えることができるので、Qtウィンドウのサイズは問題にはならない。私はちょうどクラッシュせずに何かのサイズを変更することはできません。

十分な情報を提供していない場合は、尋ねてください。

EDIT:私は、デバッガを更新し、setPixmapラインを実行すると、このエラーメッセージが表示されました:

The inferior stopped because it triggered an exception. 
Stopped in thread 0 by: Exception at 0x7ffe38fdadbb, code: 0xc0000005: 
read access violation at: 0x0, flags=0x0 (first chance). 
+1

なぜデバッグが難しいですか?デバッガでアプリケーションを実行します。 –

+0

私はそれがクラッシュする場所を知っている、私はちょうど、それについてどうやって、なぜ、何をするか分からない。デバッグが難しい理由は、私が読めるエラーメッセージが表示されないためです。アプリケーションはただハードロックしていて、あなたが持っていると思われる通常のエラーメッセージではなく、 "thisapplication.exeは動作を停止しました"というウィンドウの1つです。 – Excludos

+0

@Excludos frameProcessedにイメージを格納するのに十分なメモリがあることを確認してください。 – nikitoz

答えて

0

感謝をMailerdaimonに答えを提供するため。出力をコピーとして出力する

emit sendFrame(output.copy()); 

トリックを行います。私はまだ正確になぜこれが最初に起こっているのか、なぜこの問題が解決されているのかは分かりません。

+1

'QImage'は、生存期間と内容が' QImage'の生涯に拘束されていないフレームをラップするために起こります。 'QImage'が依然としてデータを参照している間に、ソースフレームが再割り当てされるか破壊される可能性があります。 –

+0

サイズを変更しないとうまくいかない場合は、まあまあいい説明です。 – Excludos

関連する問題