2016-04-13 11 views
1

コードからcvtColor関数をコメントアウトしようとすると、次のエラーが発生します。 "OpenCV Error:Bad flag (パラメータまたは構造体フィールド)(認識されないか、サポートされていない配列型)cvGetMatで "OpenCVエラー:cvGetMatの不正なフラグ(パラメータまたは構造体フィールド)(認識されない、またはサポートされていない配列型)

私がcvtColor関数を使用している場合、プログラムは正常に動作します。

私は元のカラーフレームが欲しくて灰色で表示されないようにしたいので、コメントアウトしようとしています。ここ は私のコードです:

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include "opencv2/video/tracking.hpp" 
#include <math.h> 
#include <time.h> 

using namespace cv; 
using namespace std; 

float MHI_DURATION = 0.05;     
int DEFAULT_THRESHOLD = 10; 

void draw_motion_comp(Mat& img, int x_coordinate, int y_coordinate, int width, int height); 

Mat frame; 

int main(int argc, char** argv) 
{ 
    namedWindow("Motion_tracking",CV_WINDOW_AUTOSIZE); 

    char fileName[100] = "C:\\Users\\survya\\Downloads/VASTChallenge2009-M3-VIDEOPART1 (1).mov"; 
    VideoCapture cap(fileName); 

    if (!cap.read(frame)) // if not success, exit program 
    { 
     cout << "Cannot open the video file" << endl; 
     return -1; 
    } 

    Mat frame,ret,frame_diff,gray_diff,motion_mask; 

    for(int i = 0; i<10; i++) 
    { 
     cap.read(frame); 
     Size frame_size = frame.size(); 
     int h = frame_size.height; 
     int w = frame_size.width; 
     if(i==5) 
      break; 

    } 

    ret = frame.clone(); 
    Size frame_size = frame.size(); 
    int h = frame_size.height; 
    int w = frame_size.width; 
    Mat prev_frame = frame.clone(); 
    Mat motion_history(h,w, CV_32FC1,Scalar(0,0,0)); 
    Mat seg_mask(h,w, CV_32FC1,Scalar(0,0,0)); 
    vector<Rect> seg_bounds; 
    Mat vis(h,w,CV_32FC3); 
    Mat vis1(h,w,CV_8UC1); 
    while(1) 
    { 
     cap.retrieve(frame); 
     cap.read(frame); 
     ret = frame.clone(); 
     if (!ret.data) //if not success, break loop 
     { 
      cout << "video ended" << endl; 
      break; 
     } 
     absdiff(frame, prev_frame, frame_diff); 

     //cvtColor(frame_diff,gray_diff, CV_BGR2GRAY); //want to comment this line out but getting the error stated in my question 

     threshold(gray_diff,ret,DEFAULT_THRESHOLD,255,0); 
     motion_mask = ret.clone(); 
     double timestamp = 1000.0*clock()/CLOCKS_PER_SEC; 
     updateMotionHistory(motion_mask, motion_history, timestamp, MHI_DURATION);   
     segmentMotion(motion_history, seg_mask, seg_bounds, timestamp, 32); 

      vis = frame.clone(); 
      vis = frame_diff.clone(); 

      for(int i=0; i< motion_history.cols; i++) 
       { 
        for(int j=0; j< motion_history.rows ; j++) 
        { 
        float a = motion_history.at<float>(j,i);     
        if((a-timestamp-MHI_DURATION)/MHI_DURATION <= -5) 
         vis1.at<uchar>(j,i) = 0; 
        else 
         vis1.at<uchar>(j,i) = (a-timestamp-MHI_DURATION)/MHI_DURATION; 
        } 
       } 

      cvtColor(vis1,vis,COLOR_GRAY2BGR); 

     for(unsigned int h = 0; h < seg_bounds.size(); h++) 
       { 
        Rect rec = seg_bounds[h]; 
        if(rec.area() > 5000 && rec.area() < 70000) 
        { 
         rectangle(vis, rec,Scalar(0,0,255),2);  
        }    
       } 
     imshow("Motion_tracking",vis);  
     prev_frame = frame.clone(); 
      if(waitKey(30) >= 0) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 

} 

答えて

0

あなたがその行をコメントアウトした場合、ため、エラーがある:

  1. threshold機能が無効で動作しますので、あなたは、gray_diffに値を割り当てることはありませんマトリックス、および

  2. あなたがabsdiffを計算する際に、frameprev_frameはタイプCV_8UC3であり、そのためにも、Rとなりますesult frame_diff。しかし、thresholdは、タイプCV_8UC1の入力が必要です。したがって、で作業するには、frame_diffをシングルチャネルgray_diffに変換する必要があります。

ので、ここであなたは必要cvtColorを使用する、と私はあなたがそれを削除したい理由はいかなる理由が表示されません。

+0

白黒ビデオの代わりにオリジナルのカラービデオでコードを実行したいので、削除します。 cvtColorを使用している場合、どのように私がそれを行うことができる任意のアイデアは必須ですか? –

+0

** **はカラービデオで作業しています。しかしながら、マスクは定義上バイナリ画像であるため、差分マスクは単一のチャネル画像であるべきであり、そうでなければならない。あなたがしたいことを理解するのは難しいですし、ここで議論するのはおそらく広範囲です。この回答は、質問に記載された問題を解決します。 – Miki

関連する問題