Videowriter function for greyscale image using OpenCV function - c++

I have a GigaE camera and which gives me a greyscale image and I want to record it as a video and process it later.
So as initial step I tried recording video using my webcam it worked and if i convert it into greyscale before writing it into video. I am not getting any video.
My code is below
int main(int argc, char* argv[])
{
VideoCapture cap(0);
VideoWriter writer;
if (!cap.isOpened())
{
cout << "not opened" << endl;
return -1;
}
char* windowName = "Webcam Feed";
namedWindow(windowName, CV_WINDOW_AUTOSIZE);
string filename = "D:\myVideo_greyscale.avi";
int fcc = CV_FOURCC('8', 'B', 'P', 'S');
int fps = 30;
Size frameSize(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
writer = VideoWriter(filename,-1,fps,frameSize);
if(!writer.isOpened())
{
cout<<"Error not opened"<<endl;
getchar();
return -1;
}
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame);
if (!bSuccess)
{
cout << "ERROR READING FRAME FROM CAMERA FEED" << endl;
break;
}
cvtColor(frame, frame, CV_BGR2GRAY);
writer.write(frame);
imshow(windowName, frame);
}
return 0;
}`
I used fcc has -1 tried all the possibilities none of them are able to record video.
I also tried creating a grayscale video using opencv for fcc has CV_FOURCC('8','B','P','S') but it did not help me.
I get this error in debug after using the breakpoint

VideoWriter has an optional parameter which tells whether the video is grayscale or color. Default ist color = true. Try
bool isColor = false;
writer = VideoWriter(filename,-1,fps,frameSize, isColor);

Related

Grayscale video file corrupted in OpenCV3.3, MJPG codec

My setup is using a logitech c920, raspberry pi 3, and the latest opencv 3.3. I am showing in screen and writing in a file the camera stream. The only processing I am doing is converting video to grayscale. In the screen all show good, but the file is corrupted (see https://i.stack.imgur.com/QHrQb.png).
Noticeable, the video is well recorded in XVID, and also in MJPG if the original color image is selected instead.
UPDATE: I tested the same code in os-x and the same error happens, also with opencv3.3
Any advice welcome :)
This is the code:
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main() {
int FPS = 10;
int nframes;
double start, now;
VideoCapture vcap(0);
if(!vcap.isOpened()) {
cout << "Error opening video stream or file" << endl;
return 0;
}
vcap.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
int frame_width = vcap.get(CV_CAP_PROP_FRAME_WIDTH);
int frame_height = vcap.get(CV_CAP_PROP_FRAME_HEIGHT);
VideoWriter video("out.avi",CV_FOURCC('M','J','P','G'), FPS, Size(frame_width,frame_height), false);
namedWindow("Main",CV_WINDOW_AUTOSIZE); //create a window called
// Start time
start = (double)getTickCount();
for(;;) {
Mat frame, gray;
vcap >> frame;
cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
video << gray;
imshow("Main", gray);
char c = (char)waitKey(2);
if( c == 27 ) break;
++nframes;
if (nframes==100) {
now = (double)getTickCount();
cout << "FPS: " << ++nframes/(now-start)*getTickFrequency() << endl;
start = now;
nframes = 0;
}
}
video.release();
return 0;
}

videowriter function doesnt save the file with opencv-3.0.0

I am working with GigaE Camera and it is a grayscale image and I want to record the videos. So I have tried initially with webcam and below is my code:
#include "opencv2\highgui\highgui.hpp"
#include "iostream"
#include "opencv2/opencv.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/videoio/videoio.hpp"
#include<string>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
VideoCapture cap(0);
VideoWriter writer;
if (!cap.isOpened())
{
cout << "not opened" << endl;
return -1;
}
char* windowName = "Webcam Feed";
namedWindow(windowName, CV_WINDOW_AUTOSIZE);
string filename = "D:\videos\myVideo12.avi";
int fcc = CV_FOURCC('M', 'J', 'P', 'J');
int fps = 30;
Size frameSize(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
bool isColor = false;
writer = VideoWriter(filename, fcc, fps, frameSize, isColor);
if (!writer.isOpened())
{
cout << "Error not opened" << endl;
getchar();
return -1;
}
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame);
if (!bSuccess)
{
cout << "ERROR READING FRAME FROM CAMERA FEED" << endl;
break;
}
cvtColor(frame, frame, CV_BGR2GRAY);
writer.write(frame);
imshow(windowName, frame);
return 0;
}
There is no video created and I don't get any error too. But it works fine with OpenCV-2.4.10.
Most likely, the video is not written because of the codec. OpenCV tends to stay silent in case of encoding (and many other) problems. Try setting fcc to -1 to choose from a list of available codecs.
Solved! The error is in the giving the filename path where I used '\' instead of '/'. The codecs are MPEG or DIV3 for grayscale images.

Converting Live Video Frames to Grayscale (OpenCV)

First and foremost, I should say that I'm a beginner to OpenCV. I'm trying to convert a live video stream from my webcam from RGB to Grayscale.
I have the following code in my function:
VideoCapture cap(0);
while (true)
{
Mat frame;
Mat grayscale;
cvtColor(frame, grayscale, CV_RGB2GRAY);
imshow("Debug Window", grayscale);
if (waitKey(30) >=0)
{
cout << "End of Stream";
break;
}
}
I know it isn't complete. I'm trying to find a way to take a frame of the video and send it to frame, manipulate it using cvtColor, then output it back to grayscale so I can display it on my screen.
If anyone could help, it would be much appreciated.
Please see this example, here the complete code exists, hope this will work for you:
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
VideoCapture cap(0); // open the video camera no. 0
if (!cap.isOpened()) // if not success, exit program
{
cout << "Cannot open the video cam" << endl;
return -1;
}
namedWindow("MyVideo",CV_WINDOW_AUTOSIZE);
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame); // read a new frame from video
if (!bSuccess)
{
cout << "Cannot read a frame from video stream" << endl;
break;
}
Mat grayscale;
cvtColor(frame, grayscale, CV_RGB2GRAY);
imshow("MyVideo", grayscale);
if (waitKey(30) == 27)
{
cout << "esc key is pressed by user" << endl;
break;
}
}
return 0;
}
You just initialized the variable "frame" and forgot to assign an image to it. Since the variable "frame" is empty you won't get output. Grab a image and copy to frame from the video sequence "cap". This piece of code will do the job for you.
Mat frame;
bool bSuccess = cap.read(frame); // read a frame from the video
if (!bSuccess)
{
cout << "Cannot read a frame from video stream" << endl;
break;
}

Writing Video to File with OpenCV

Hi im trying to write a video from my webcam to my computer but I keep getting the error that my writer isnt opened. Im using windows 8 64 bit, VS 2013 & OpenCV 2.4.10. Here is the code that I am using:
#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <iostream>
using namespace cv;
using namespace std;
string intToString(int number){
std::stringstream ss;
ss << number;
return ss.str();
}
int main(int argc, char* argv[])
{
VideoCapture cap(0); // open the video camera no. 0
VideoWriter writer;
if (!cap.isOpened()) // if not success, exit program
{
cout << "ERROR INITIALIZING VIDEO CAPTURE" << endl;
return -1;
}
char* windowName = "Webcam Feed";
namedWindow(windowName, CV_WINDOW_AUTOSIZE); //create a window to display our webcam feed
string filename = "C:\\thevideo.avi";
int fcc = CV_FOURCC('D', 'I', 'V', '3');
double fps = 20;
cv::Size frameSize(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
writer = VideoWriter(filename, fcc, fps, frameSize);
if (!writer.isOpened())
{
cout << "the writer isnt opened" << endl;
getchar();
return -1;
}
while (1) {
Mat frame;
bool bSuccess = cap.read(frame); // read a new frame from camera feed
if (!bSuccess) //test if frame successfully read
{
cout << "ERROR READING FRAME FROM CAMERA FEED" << endl;
break;
}
writer.write(frame);
imshow(windowName, frame); //show the frame in "MyVideo" window
//listen for 10ms for a key to be pressed
switch (waitKey(10)){
case 27:
//'esc' has been pressed (ASCII value for 'esc' is 27)
//exit program.
return 0;
}
}
return 0;
}
Can anyone help me?
I find the use a bit confusing. You do:
VideoWriter writer;
and then
writer = VideoWriter(filename, fcc, fps, frameSize);
Either do:
VideoWriter writer = VideoWriter(filename, fcc, fps, frameSize);
or
VideoWriter writer;
writer.open(filename, 0, fps, frameSize, 1);
Perhaps that is the issue?
Also, in writer.open(), the last parameter sis the colour setting. Set it accordingly. I have assumed you have colour input.
Also, a more complicated thing could be codec issue. I read that OPENCV can only write AVI files. So, I am not sure if it can use the DIV3 codec for writing. Call the writer with:
writer = VideoWriter(filename, -1, fps, frameSize);
and see what codecs can be used.
Try this codec:
int fcc = CV_FOURCC('M', 'J', 'P', 'G')
instead of:
int fcc = CV_FOURCC('D', 'I', 'V', '3');

Failing to use VideoWriter for writing from a webcam capture

I am trying to write the recording from my webcam into a file. For this purpose I am using the following code. I am getting an exit code of 2, all the time. Can someone help me figure out what is the problem?
I have previously used a similar function call to write frames from one video file into a new one, where it worked. Can't understand what is the problem in this case.
Code Snippet follows:
int main(int argc, char *argv[]){
cv::Mat frame;
cv::VideoCapture cap(0);
cv::BackgroundSubtractorGMG bg;
bg.numInitializationFrames=120;
bg.decisionThreshold = 0.95;
bg.maxFeatures = 10;
double fps = cap.get(CV_CAP_PROP_FPS);
CvSize frameSize;
frameSize.height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
frameSize.width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
VideoWriter VW1("resultbuff.avi",CV_FOURCC('M','P','E','G'), fps, frameSize, 1);
VideoWriter VW2("recordingbuff.avi",CV_FOURCC('M','P','E','G'), fps, frameSize, 1);
VideoWriter VW3("finalResult.avi",CV_FOURCC('M','P','E','G'), fps, frameSize, 1);
if (!VW1.isOpened())
{
std::cout << "!!! Output video could not be opened" << std::endl;
return 2;
}
if (!VW2.isOpened())
{
std::cout << "!!! Output video could not be opened" << std::endl;
return 3;
}
if (!VW3.isOpened())
{
std::cout << "!!! Output video could not be opened" << std::endl;
return 4;
}
As mentioned, the program exits with code 2.
Okay, I found the answer. It was an error with the dlls. I was running the program in debug mode and the openCV dlls linked were for the release mode.