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

Time:06-20

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?

CodePudding user response:

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;
  • Related