Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Video frame returning !_src.empty() in function 'cvtColor' error

I am trying to convert frames from a video to Tensors as the video is playing. This is my code:

#include <iostream>
#include "src/VideoProcessing.h"
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>

typedef cv::Point3_<float> Pixel;

const uint WIDTH = 224;
const uint HEIGHT = 224;
const uint CHANNEL = 3;
const uint OUTDIM = 128;

void normalize(Pixel &pixel){
    pixel.x = (pixel.x / 255.0 - 0.5) * 2.0;
    pixel.y = (pixel.y / 255.0 - 0.5) * 2.0;
    pixel.z = (pixel.z / 255.0 - 0.5) * 2.0;
}

int main() {
    int fps = VideoProcessing::getFPS("trainer.mp4");
    unsigned long size = VideoProcessing::getSize("trainer.mp4");
    cv::VideoCapture cap("trainer.mp4");

    //Check if input video exists
    if(!cap.isOpened()){
        std::cout<<"Error opening video stream or file"<<std::endl;
        return -1;
    }

    //Create a window to show input video
    cv::namedWindow("input video", cv::WINDOW_NORMAL);

    //Keep playing video until video is completed
    while(true){
        cv::Mat frame;
        frame.convertTo(frame, CV_32FC3);
        cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); // convert to float; BGR -> RGB

        // normalize to -1 & 1
        auto* pixel = frame.ptr<Pixel>(0,0);
        const Pixel* endPixel = pixel + frame.cols * frame.rows;
        for (; pixel != endPixel; pixel++){normalize(*pixel);}

        // resize image as model input
        cv::resize(frame, frame, cv::Size(WIDTH, HEIGHT));

        //Capture frame by frame
        bool success = cap.read(frame);

        //If frame is empty then break the loop
        if (!success){
            std::cout << "Found the end of the video" << std::endl;
            break;
        }

        //Show the current frame
        cv::imshow("input video", frame);
        if (cv::waitKey(10) == 27){
            std::cout << "Esc key is pressed by user. Stopping the video" << std::endl;
            break;
        }

    }

    //Close window after input video is completed
    cap.release();

    //Destroy all the opened windows
    cv::destroyAllWindows();

    std::cout << "Video file FPS: " << fps << std::endl;
    std::cout << "Video file size: " << size << std::endl;

    return 0;
}

My goal (down the road) is to run inference on each frame to get landmarks. However, at this stage, I see this error:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.1.0) /home/onur/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

Aborted (core dumped)

Where am I going wrong?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

You will have to read the frame before performing any conversion.

Move the part

        //Capture frame by frame
        bool success = cap.read(frame);

        //If frame is empty then break the loop
        if (!success){
            std::cout << "Found the end of the video" << std::endl;
            break;
        }

Just after

        cv::Mat frame;
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading