2016-04-13 26 views
1

Kodumdan cvtColor işlevine yorum yapmaya çalıştığımda aşağıdaki hatayı alıyorum: "OpenCV Hatası: Hatalı bayrak (parametre veya yapı alanı) cvGetMat öğesinde (Tanınmayan veya desteklenmeyen dizi türü) "OpenCV Hatası: Bozuk bayrak (parametre veya yapı alanı) (tanınmayan veya desteklenmeyen dizi türü) cvGetMat

cvtColor işlevini kullanıyorum, program düzgün çalışıyor.

Özgün renkli çerçeveyi istediğimden ve grileştirilmediğinden yorum yapmaya çalışıyorum. İşte benim kodudur:

hata o duruşu dışarı yorum yaparsanız çünkü
#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; 

} 

cevap

0

: Eğer gray_diff bir değer atamak asla

  1. , bu nedenle aşağıdaki threshold işlevi geçersiz çalışacak bunu absdiff, frame ve prev_frame tip CV_8UC3 vardır hesaplamak ve matris ve

  2. da r olacak frame_diff. Ancak threshold, CV_8UC1 türünde bir girdi bekliyor. Bu nedenle threshold ile çalışmak için frame_diff tek kanallı gray_diff dönüştürmek gerekir.

Yani, burada ihtiyaçcvtColor kullanmak, ve bunu kaldırmak istediğiniz bir neden görmüyorum.

+0

Kodu kaldırmak istiyorum çünkü kodun siyah beyaz bir video yerine orijinal renkli videoda çalışmasını istiyorum. CvtColor kullanılıyorsa nasıl yapabileceğime dair bir fikrin var mı? –

+0

Siz ** bir renkli video üzerinde çalışıyorsunuz. Bununla birlikte, fark maskesi, tek bir kanal görüntüsüdür ve bir maske, tanım gereği ikili bir görüntü olduğu için. Ne yapmak istediğini anlamak çok zor, ve muhtemelen burada tartışılacak bir şey var. Bu cevap, soruya verilen problemi ele almaktadır. – Miki