コードから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;
}
白黒ビデオの代わりにオリジナルのカラービデオでコードを実行したいので、削除します。 cvtColorを使用している場合、どのように私がそれを行うことができる任意のアイデアは必須ですか? –
** **はカラービデオで作業しています。しかしながら、マスクは定義上バイナリ画像であるため、差分マスクは単一のチャネル画像であるべきであり、そうでなければならない。あなたがしたいことを理解するのは難しいですし、ここで議論するのはおそらく広範囲です。この回答は、質問に記載された問題を解決します。 – Miki