要修复视频FPS opencv吗?

时间:2019-03-06 12:45:56

标签: c++ opencv visual-studio-2017

如何使我的视频不延迟,在代码的开头也没有延迟,但是如果我使用GaussianBlur,形态学操作和SimpleBlobDetector,则视频会延迟,请有人帮助我..

预先感谢

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[]){

    VideoCapture cap(0);
    cap.open("file.mp4"); //read the video

    if (!cap.isOpened())
    {
        cout << "Cannot open the video cam" << endl;
        return -1;
    }  
    double Width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
    double Height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);

    cvNamedWindow("MyVideo", CV_WINDOW_AUTOSIZE);

    while (1)
    {
        Mat frame;
        bool bSuccess = cap.read(frame);
        SimpleBlobDetector::Params params;
        // Change thresholds
        params.minThreshold = 0;
        params.maxThreshold = 255;

        params.filterByColor = true;
        params.blobColor = 255;

        // Filter by Area.
        params.filterByArea = true;
        params.minArea = 5 ;
        // Filter by Circularity
        params.filterByCircularity = true;
        params.minCircularity = 0.1;

        // Filter by Convexity
        params.filterByConvexity = true;
        params.minConvexity = 0.87;

        // Filter by Inertia
        params.filterByInertia = true;
        params.minInertiaRatio = 0.01;


    //crop the image with the pixel i want
        Mat blur, crop;
        GaussianBlur(frame, blur, Size(15, 15), 0); //blur the image
        Point corners[1][4];
        corners[0][0] = Point(550, 30); //top left
        corners[0][1] = Point(250, 700); //bottom left
        corners[0][2] = Point(1100, 700); //bottom right
        corners[0][3] = Point(600, 30); //top right
        const Point* corner_list[1] = { corners[0] };
        int num_points = 4;
        int num_polygons = 1;
        int line_type = 8;
        Mat mask(720, 1280, CV_8UC3, cv::Scalar(0, 0, 0));
        fillPoly(mask, corner_list, &num_points, num_polygons, cv::Scalar(255, 255, 255), line_type);
        bitwise_and(blur, mask, crop);//combine the image


        Mat gray, changeToBlack;
        cvtColor(crop, gray, COLOR_BGR2GRAY); //grayscale citra
        inRange(gray, Scalar(0), Scalar(0), changeToBlack);
        Mat black_image(gray.size(), CV_8U, Scalar(255));  
        black_image.copyTo(gray, changeToBlack);

        Mat thres, tes;
        threshold(gray, tes, 51, 255, THRESH_BINARY_INV); //threshold citra and 51 set value

        Mat erosi, dilasi, open, close, tophat;
        Mat kernel = Mat(3, 3, CV_8UC1, Scalar(1));
        morphologyEx(tes, erosi, MORPH_ERODE, kernel, Point(-1, -1), 3);
        morphologyEx(erosi, dilasi, MORPH_DILATE, kernel, Point(-1, -1), 20);

        vector<KeyPoint> keypoints;
        Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);  
        detector->detect(dilasi, keypoints);

        Mat im_with_keypoints;
        drawKeypoints(dilasi, keypoints, im_with_keypoints, Scalar(205, 0, 0), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

        imshow("gray", frame);
        imshow("MyVideo", im_with_keypoints);

        if (waitKey(30) == 27)
        {
            cout << "esc key is pressed by user" << endl;
            break;
        }   
    }
    return 0;
}

任何人都请帮助我

1 个答案:

答案 0 :(得分:1)

哦!循环内的所有动作和内存分配。试试这个:

int _tmain(int argc, _TCHAR* argv[]){

    VideoCapture cap(0);
    cap.open("file.mp4"); //read the video

    if (!cap.isOpened())
    {
        cout << "Cannot open the video cam" << endl;
        return -1;
    }
    double Width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
    double Height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);

    cvNamedWindow("MyVideo", CV_WINDOW_AUTOSIZE);

    Mat frame;
    Mat blur, crop;
    Mat mask(720, 1280, CV_8UC3, cv::Scalar(0, 0, 0));
    Mat gray, changeToBlack;
    Mat black_image(gray.size(), CV_8U, Scalar(255));
    Mat thres, tes;
    Mat erosi, dilasi, open, close, tophat;
    Mat kernel = Mat(3, 3, CV_8UC1, Scalar(1));
    Mat im_with_keypoints;

    SimpleBlobDetector::Params params;
    // Change thresholds
    params.minThreshold = 0;
    params.maxThreshold = 255;

    params.filterByColor = true;
    params.blobColor = 255;

    // Filter by Area.
    params.filterByArea = true;
    params.minArea = 5 ;
    // Filter by Circularity
    params.filterByCircularity = true;
    params.minCircularity = 0.1;

    // Filter by Convexity
    params.filterByConvexity = true;
    params.minConvexity = 0.87;

    // Filter by Inertia
    params.filterByInertia = true;
    params.minInertiaRatio = 0.01;

    vector<KeyPoint> keypoints;
    Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);

    while (cap.read(frame))
    {
    //crop the image with the pixel i want
        GaussianBlur(frame, blur, Size(15, 15), 0); //blur the image
        Point corners[1][4];
        corners[0][0] = Point(550, 30); //top left
        corners[0][1] = Point(250, 700); //bottom left
        corners[0][2] = Point(1100, 700); //bottom right
        corners[0][3] = Point(600, 30); //top right
        const Point* corner_list[1] = { corners[0] };
        int num_points = 4;
        int num_polygons = 1;
        int line_type = 8;
        fillPoly(mask, corner_list, &num_points, num_polygons, cv::Scalar(255, 255, 255), line_type);
        bitwise_and(blur, mask, crop);//combine the image

        cvtColor(crop, gray, COLOR_BGR2GRAY); //grayscale citra
        inRange(gray, Scalar(0), Scalar(0), changeToBlack);
        black_image.copyTo(gray, changeToBlack);

        threshold(gray, tes, 51, 255, THRESH_BINARY_INV); //threshold citra and 51 set value

        morphologyEx(tes, erosi, MORPH_ERODE, kernel, Point(-1, -1), 3);
        morphologyEx(erosi, dilasi, MORPH_DILATE, kernel, Point(-1, -1), 20);

        detector->detect(dilasi, keypoints);

        drawKeypoints(dilasi, keypoints, im_with_keypoints, Scalar(205, 0, 0), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

        imshow("gray", frame);
        imshow("MyVideo", im_with_keypoints);

        if (waitKey(1) == 27)
        {
            cout << "esc key is pressed by user" << endl;
            break;
        }
    }
    return 0;
}