2011-11-24 64 views
2

这是从 Opencv video frame giving me an error 的延续问题我想我关闭它,Im新的Stackoverflow。Opencv视频帧没有显示Sobel输出

我有下面的代码,我试图看到它的Sobel边缘图像。然而程序运行,但输出只是一个灰色的屏幕,如果我鼠标光标消失。 有没有人看到错误?或者是它使用

IplImage *frame, *frame_copy = 0; 

// capture frames from video 
CvCapture *capture = cvCaptureFromFile("lightinbox1.avi"); 
//Allows Access to video propertys 
cvQueryFrame(capture); 

//Get the number of frames 
int nframe=(int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT); 

//Name window 
cvNamedWindow("video:", 1); 

//start loop 
for(int i=0;i<nframe;i++){ 
//prepare capture frame extraction 
cvGrabFrame(capture); 
cout<<"We are on frame "<<i<<"\n"; 
//Get this frame 
frame = cvRetrieveFrame(capture); 
con2txt(frame); 
frame_copy = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,frame->nChannels); 
//show and destroy frame 
cvCvtColor(frame,frame,CV_RGB2GRAY); 

//Create Sobel output 
frame_copy1 = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_16S,1); 
cvSobel(frame_copy,frame_copy1,2,2,3); 

cvShowImage("video:",frame_copy1); 
cvWaitKey(33);} 
cvReleaseCapture(&capture); 

回答

1

在这种情况下,有关数据结构我是个误会,我想那是因为你用不同的深度创建目标图像比原:

frame_copy1 = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_16S,1); 

和你应该做的:

frame_copy1 = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,1); 

反正this post显示了使用cvSobel一个例子。

+0

我认为他使用了正确的深度。如果输入为“IPL_DEPTH_8U”,则'cvSobel'预计输出类型为'IPL_DEPTH_16S',因为Sobel滤波的结果可能为负值。 – misha

1

我认为OpenCV在智能显示您的16位图像时遇到问题。您可以验证是否是这种通过执行以下步骤的情况下:

  1. 创建一个8位图像(称之为result8bit)。 OpenCV善于展示这些。
  2. 计算的最小和最大的frame_copy1(见cvMinMaxLoc
  3. 使用cvScale使用的最小和最大缩放图像
  4. 显示result8bitframe_copy1转换为result8bit

祝你好运。