opencv将视频canny后显示播放一卡一卡的,是不是需要的canny时间太长了,怎么解决

如题所述

第1个回答  2014-07-04
显示卡的话可能是申请的内存没有释放,处理过程中申请的内存使用后要释放;

下面是我的代码,VS2010+OpenCV2.3和VC6.0+OpenCV1.0下都能运行通过,没有一卡一卡现象。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#include "cxcore.h"
#include "windows.h"

int main()
{
CvCapture *capture = NULL;
IplImage *frame = NULL;

char *AviFileName = "D:\\AVI\\22.avi";//视频的目录
char *AviSavePath = "D:\\截图\\";//图片保存的位置, 注意“截图”文件夹需要手动创建
const int jiange = 1;//间隔 X 帧保存一次图片
capture = cvCaptureFromAVI(AviFileName);
//获取视频信息
cvQueryFrame(capture);
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n\tframe numbers : %d\n", frameH, frameW, fps, numFrames);

if(!capture)
{
printf("Could not initialize capturing...\n");
return 0;
}

cvNamedWindow("AVI player",1);
int count_tmp = 0;//计数总帧数
char tmpfile[100]={'\0'};
while(true)
{
if(cvGrabFrame(capture))
{
if (count_tmp % jiange == 0)
{
frame=cvRetrieveFrame(capture);
IplImage* img_Canny = cvCreateImage(cvGetSize(frame),frame->depth,1);
IplImage *dst_gray = cvCreateImage(cvGetSize(frame),frame->depth,1);

cvCvtColor(frame,dst_gray,CV_RGB2GRAY);//将RGB三通道图像转化为单通道灰度图
cvCanny(dst_gray,img_Canny,60,200,3);//canny算法检测边缘
cvShowImage("AVI player",img_Canny);//显示当前帧
sprintf(tmpfile,"%s\\%d.jpg",AviSavePath,count_tmp);//使用帧号作为图片名

// if(count_tmp==90)
cvReleaseImage(&img_Canny);
cvReleaseImage(&dst_gray);
cvSaveImage(tmpfile,frame);
}
if(cvWaitKey(10)>=0) //延时
break;
++count_tmp;

}
else
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("AVI player");
printf("总帧数:%d\n",count_tmp);

}本回答被提问者采纳

opencv将视频canny后显示播放一卡一卡的,是不是需要的canny时间太长了...
显示卡的话可能是申请的内存没有释放,处理过程中申请的内存使用后要释放;下面是我的代码,VS2010+OpenCV2.3和VC6.0+OpenCV1.0下都能运行通过,没有一卡一卡现象。include <stdlib.h> include <stdio.h> include <math.h> include <cv.h> include <highgui.h> include "cxcore.h"include "...

opencv边缘检测(1)canny
边缘检测算法包括但不限于Canny算法,该算法是目前最佳的边缘检测方法。其核心步骤如下:首先,使用高斯平滑滤波器去除噪声,通过将图像矩阵与水平和垂直Sobel核进行卷积,得到dx和dy。卷积通常在奇数矩阵中进行。接着,计算dx和dy的幅度和方向,这有助于我们定位图像中灰度变化显著的区域。接下来,通过非最...

opencv中有几个函数不懂是什么意思
回答:1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示图像; 4、cvWaitKey:使程序暂停,等待用户触发一个按键操作; 5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:...

canny算法OpenCV中的Canny函数
在OpenCV中,Canny算法是一种常用的边缘检测技术,通过函数cvCanny实现。这个函数的调用形式如下:cvCanny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size = 3);参数说明如下:image: 输入的图像,是边缘检测的基础数据。edges: 输出结果,将显示检测到的...

opencv里面对cvCanny函数使用的时候对图像有要求吗?为什么我的这段代码...
cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 0);这句有问题,这个函数是创建一幅图片,最后一个参数代表通道数,但是你定义的图片的通道数是0,是不对的,一般是1或者3 cvCanny是对二值图进行检测的,所以img应该是一张二值图,image000保存检测结果,也要是二值图 ...

opencv关于canny算子的程序中,怎样改才能使下面程序的argc参数=2并读 ...
这两个参数如果都是文件的话,要用绝对地址,把文件拖到DOS窗口就会自动生成地址了。其实没必要这么麻烦,只需要你把图片放到Debug的文件夹里,然后把图片拖到exe的执行文件上,就可以执行了。当然我们更喜欢这种写法 char* filename = argc == 2 ? argv[1] : (char*)"lena.jpg";if( pImg = ...

为什么opencv的canny函数检测边缘的效果和matlab的不同
5、顺着二次筛选后的强边点寻找邻近的弱边点得到最终的边缘。opencv和matlab都基本按照以上步骤得到各自的canny 函数,但一般来说处理之前都先对图像进行模糊平滑,这样得到的效果更好。opencv更注重实时性,所以连平滑都作为可选项放在函数外,而matlab则 更注重质量,除了加入平滑操作外,还有其他一系列的...

在网上看了个opencv的canny的例子,但是运行时为什么视频是倒过来的
在使用opencv显示图像时会出现图像倒立的情况,IplImage的origin属性有关系。origin为0表示顶左结构,即图像的原点是左上角,如果为1为左下角。因此,对于frame_gray和frame_canny这两个变量,需要在创建之后修改其origin属性:frame_gray->origin = frame ->origin;

已经使用opencv中的cvCanny算法对图像进行了边缘检测,得到了所有边缘...
利用cvFindContours函数,将边缘一一单独存储,然后可以单独显示

用opencv cvcanny 我将存储二值图的图像深度设为IPL_DEPTH_1U,出错,这 ...
图像深度设为IPL_DEPTH_8U,然后通道设为1,给你个例子。IplImage *gray=cvcreateImage(cvgetsize(src),IPL_DEPTH_8U,1)

相似回答