开发者

Why does OpenCV emit "Bad flag in unknown function" for this code?

I have been trying to get a real basic video player working using the Open CV API. Everything seems to run smoothly until the end of a video clip, then i get this error:

OpenCV Error: Bad flag in unknown function, file ........\ocv\opencv\modules\core\src\array.cpp

This creates a break in the code at imshow("video", frame), i find this wierd as this is the part that effectively plays the video so why does it only kick up a fuss at the end of the clip?? I found that it seems to give me this error in the last 90% of every video i play so at the moment im working around it by telling it to stop once 90% of the clip has played but this isnt very good programming so can anyone send some suggestions/help?

I have looked at other peoples post on this matter and none of the solution suggested have worked for me as of yet.

Heres my code...its only an experimentation piece so im sorry if its a bit messy:

Thanks for any help in advance

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <direct.h>
#include <iostream>

using namespace cv;

void onTrackBarSlide(int);

double the_next_play_frame;

VideoCapture video("test.MOV"); // open the video file

int main(int, char**)
{

if(!video.isOpened())  // check if we succeeded
{
    return -1;
}

int no_of_frames =  video.get(CV_CAP_PROP_FRAME_COUNT); //total number of frames in       video

std::cout << no_of_frames << std::endl;

std::cout << video.get(CV_CAP_PROP_FPS) << std::endl;

namedWindow("Video", 1);
cvCreateTrackbar("trackbar", "Video", 0, 40, onTrackBarSlide);

double stop_at = no_of_frames * 0.999;
    for(;;){



    if(the_next_play_frame >= double(stop_at))
    {
        break;
    }

     Mat frame;
    video >> frame; // get a new frame from camera  

    imshow("Video", frame); // <---------- place where break/error occurs   

    if(waitKey(30) >= 0) 
    {
        break;
    }


}

return 0;
}

void onTrackBarSlide(int pos)
{
std::cout << getTrackbarPos("trackbar", "Video") << std::endl;

double frameratio = video.get(CV_CAP_PROP_FRAME_COUNT)/40; //10005 is开发者_运维知识库 the maximum   value the slider can actual hold

double next_play_frame = frameratio * getTrackbarPos("trackbar", "Video");
video.set(CV_CAP_PROP_POS_FRAMES,next_play_frame);

the_next_play_frame = next_play_frame;

}


VideoCapture video("test.MOV"); // open the video file

int main(int, char**)
{

if(!video.isOpened())  // check if we succeeded
{
    return -1;
}
}

Try put the VideoCapture instantiation inside main.

int main(){
 VideoCapture video("test.MOV"); // open the video file

...
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜