2017-03-19 2 views
0

グレースケールで2つの画像を40msごとに減算したい場合は、2台のカメラから40msごとに2枚の画像をキャプチャし、2つの画像サイズを(高さ= 480、幅= 640)、その後グレースケールに変換します。 しかし、2つの画像に減算(absdiff)を使用すると、「実行時エラー」が発生します。 私は、2つの画像のサイズを表示すると、2つのグレースケール画像のサイズが一致しないことに気付きました。私が宣言ヘッダの Opencv&Qtを使用した2つのグレースケール画像の使用条件の減算

src_gray1 cols is: =640 src_gray1 rows is: =480 src_gray1.size =0x28fd5c 
src_gray2 cols is: =640 src_gray2 rows is: =480 src_gray2.size =0x28fdcc 

: CV ::マットedges1、src_gray1、edges2、src_gray2、src_gray3。

私の質問:いただきましたサブトラクション法における問題は、 の大きさは、グレースケールマットは、私はそれを乗り越えるために 二つの画像のために同じプロパティを設定することができますどのように?問題です。私はここでのQt 5.5.0、私のコードを使用し

void MainWindow::on_pushButton_pressed() 
{ 
    timer_40_ms->start(); 
    timer2_40_ms->start(); 
    cap1.open(0); 
    if(!cap1.isOpened()) 
    { 
     std::cout<<"Camera1 did not open"; 
     return; 
    } 
    cap2.open(1); 
    if(!cap2.isOpened()) 
    { 
     std::cout<<"Camera2 did not open"; 
     return; 
    } 
    cap1.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap1.set(CV_CAP_PROP_FRAME_WIDTH,640); 
    cap2.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap2.set(CV_CAP_PROP_FRAME_WIDTH,640); 

} 
void MainWindow::ProcessFrame() 
{ 
    cv::Mat frame1; 
    ii++; 
    ui->textEdit->setText(QString::number(ii)); 
    cap1 >> frame1; 
    cvtColor(frame1, src_gray1, CV_BGR2GRAY); 
    std::cout<<"src_gray1 cols is:"<<" ="<<src_gray1.cols<<" "<<"src_gray1 rows is:"<<" ="<<src_gray1.rows<<" "<<"src_gray1.size ="<<src_gray1.size<<'\n'; 
    } 
void MainWindow::ProcessFrame2() 
{ 
    cv::Mat frame2; 
    ii2++; 
    cap2 >> frame2; 
    cvtColor(frame2, src_gray2, CV_BGR2GRAY); 
    ui->textEdit_3->setText(QString::number(ii2)); 
    absdiff(src_gray1,src_gray2,src_gray3); 
    cv::imshow("CAM2 Video Labeler", src_gray3); 
    std::cout<<"src_gray2 cols is:"<<" ="<<src_gray2.cols<<" "<<"src_gray2 rows is:"<<" ="<<src_gray2.rows<<" "<<"src_gray2.size ="<<src_gray2.size<<'\n'; 
} 
+0

どのような種類のランタイムエラーですか?デバッグを試しましたか?あなたは何を見つけましたか? |ところで、あなたは 'Mat :: size'を間違って使用しています(おそらく、含まれているポインタの値を表示するでしょう)。 '()'演算子を呼び出す必要があります。ピクセル数が必要な場合は、結果に '.area()'を呼び出します。すなわち 'src_gray1.size()。area()'です。 –

+0

@DanMašekは、 'cv :: Exception'のインスタンスをスローした後に呼び出されたときに呼び出されます。 オペレーションは '配列op配列'(配列のサイズとチャンネル数が同じです)、 'array op scalar'スカラー演算配列 'function arithm_op – user119436

+0

@DanMašekランタイムエラーは、 "このアプリケーションはランタイムに異常な方法で終了させるようにランタイムを要求しました"です。減算操作を使用したときに問題が発生します。 – user119436

答えて

0

問題がProcessFrame2は()ProcessFrame(前に呼び出されたということであった)、助けのためMasek @danありがとう:

 void MainWindow::on_pushButton_pressed() 
    { 
    timer_40_ms->start(); 
    timer2_40_ms->start(); 
    cap1.open(0); 
    if(!cap1.isOpened()) 
    { 
     std::cout<<"Camera1 did not open"; 
     return; 
    } 
    cap2.open(1); 
    if(!cap2.isOpened()) 
    { 
     std::cout<<"Camera2 did not open"; 
     return; 
    } 
    cap1.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap1.set(CV_CAP_PROP_FRAME_WIDTH,640); 
    cap2.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap2.set(CV_CAP_PROP_FRAME_WIDTH,640); 

    } 
void MainWindow::ProcessFrame() 
{ 
    cv::Mat frame1; 
    ii++; 
    ui->textEdit->setText(QString::number(ii)); 
    cap1 >> frame1; 
    cvtColor(frame1, src_gray1, CV_BGR2GRAY); 
    absdiff(src_gray1,src_gray2,src_gray3); 
    cv::imshow("CAM2 Video Labeler", src_gray3); 
    std::cout<<"src_gray1 cols is:"<<" ="<<src_gray1.cols<<" "<<"src_gray1 rows is:"<<" ="<<src_gray1.rows<<" "<<"src_gray1.size ="<<src_gray1.size<<'\n'; 
    } 
void MainWindow::ProcessFrame2() 
{ 
    cv::Mat frame2; 
    ii2++; 
    cap2 >> frame2; 
    cvtColor(frame2, src_gray2, CV_BGR2GRAY); 
    ui->textEdit_3->setText(QString::number(ii2)); 

    std::cout<<"src_gray2 cols is:"<<" ="<<src_gray2.cols<<" "<<"src_gray2 rows is:"<<" ="<<src_gray2.rows<<" "<<"src_gray2.size ="<<src_gray2.size<<'\n'; 
    } 
関連する問題