问题
I would like to read in a colour video and have the output as a grayscale video. Below is the code that I have which runs just fine but the output is my same colour video. Would anyone be able to identify the problem?
//Convert a video to grayscale
//argv[1]: input video file
//argv[2]: name of new output file
#include "cv.h"
#include "highgui.h"
int main( int argc, char* argv ) {
CvCapture* capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
return -1;
}
IplImage *bgr_frame=cvQueryFrame(capture);//Init the video read
double fps = cvGetCaptureProperty (
capture,
CV_CAP_PROP_FPS
);
CvSize size = cvSize(
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT)
);
CvVideoWriter *writer = cvCreateVideoWriter(
"Output video",//filename for new file
CV_FOURCC('M','J','P','G'),//video codec to compress video stream
fps,
size
);
IplImage* logpolar_frame = cvCreateImage(
size,
IPL_DEPTH_8U,
3
);
while( (bgr_frame=cvQueryFrame(capture)) != NULL ) {
cvLogPolar( bgr_frame, logpolar_frame,
cvPoint2D32f(bgr_frame->width/2,
bgr_frame->height/2),
40,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
cvWriteFrame( writer, logpolar_frame );
}
cvReleaseVideoWriter( &writer );
cvReleaseImage( &logpolar_frame );
cvReleaseCapture( &capture );
IplImage*image;
CvCapture*recorder = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
cvNamedWindow("Output video",1);
while(1) {
image=cvQueryFrame(recorder);
if(image==NULL)
{
break;
}
cvShowImage("Output video",image);
char c= cvWaitKey(30);
if(c==27)
{
break;
}
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Output video" );
return 0;
}
回答1:
Looks to me as if your problem is simply that the video you're displaying in the "Output video" window is actually your "lady walking.avi" input video, not the video you output.
来源:https://stackoverflow.com/questions/9289705/convert-video-from-colour-to-grayscale