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;
}
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ı? –
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