- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试掌握 OpenCV。目前我正在尝试将两帧相减并显示结果。我找到了可以很好地做到这一点的示例代码。我的问题是出现内存分配错误。好吧,这没什么特别的,因为我正在为节目提供高清视频。所以我的问题是如何释放分配给 IplImage* 的内存?Mat 类型类似于 Mat.release()。IplImage 没有,free(IplImage) 也没有。
这是我的代码:
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\highgui\highgui_c.h>
using namespace cv;
int main()
{
std::string videofilename;
std::cout << "Please specify the video name (make sure it is in the same folder\nas the application!):" << std::endl;
std::cin >> videofilename;
std::cout << "The name you provided: " << videofilename << std::endl;
VideoCapture video(videofilename);
if(!video.isOpened())
{
std::cout << "Could not open video file" << std::endl;
return -1;
}
std::cout << "Number of frames: " << video.get(CV_CAP_PROP_FRAME_COUNT) << std::endl;
std::cout << "Duration: "<< static_cast<int>(video.get(CV_CAP_PROP_FRAME_COUNT))/(30*60) << "min " << static_cast<int>((video.get(CV_CAP_PROP_FRAME_COUNT)))%(30*60)/30 << "sek" << std::endl;
// Close it before opening for playing
video.release();
CvCapture* capture = cvCaptureFromAVI(videofilename.c_str());
IplImage* frame = cvQueryFrame(capture);
IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
if ( !capture )
{
std::cout << "Could not open video file" << std::endl;
return -1;
}
cvNamedWindow("dest", CV_WINDOW_AUTOSIZE);
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)
{
printf("Capture Finished\n");
break;
}
currframe = cvCloneImage(frame); // copy frame to current
frame = cvQueryFrame(capture); // grab frame
if(!frame)
{
printf("Capture Finished\n");
break;
}
cvSub(frame, currframe, destframe); // subtraction between the last frame to cur
cvShowImage("dest", destframe);
//cvReleaseImage(currframe); // doesn't work
//free(currframe); // doesnt work either
//delete(currframe); //again, no luck
cvWaitKey(30);
}
cvDestroyWindow("dest");
cvReleaseCapture(&capture);
return 0;
}
最佳答案
您可以使用cvReleaseImage
释放IplImage
。它采用指向 IplImage
的指针地址,即 IplImage**
作为参数,因此您必须这样做:
cvReleaseImage(&currframe);
代替 cvReleaseImage(currframe);
。
但请记住,cvQueryFrame
返回的图像(在您的情况下为 frame
)是一种特殊情况,不应发布或修改。此外,如果您最终要使用 cvCloneImage
对其进行初始化,则不必预先分配 currFrame
。
最终代码如下所示:
int main()
{
std::string videofilename;
std::cout << "Please specify the video name (make sure it is in the same folder\nas the application!):" << std::endl;
std::cin >> videofilename;
std::cout << "The name you provided: " << videofilename << std::endl;
VideoCapture video(videofilename);
if(!video.isOpened())
{
std::cout << "Could not open video file" << std::endl;
return -1;
}
std::cout << "Number of frames: " << video.get(CV_CAP_PROP_FRAME_COUNT) << std::endl;
std::cout << "Duration: "<< static_cast<int>(video.get(CV_CAP_PROP_FRAME_COUNT))/(30*60) << "min " << static_cast<int>((video.get(CV_CAP_PROP_FRAME_COUNT)))%(30*60)/30 << "sek" << std::endl;
// Close it before opening for playing
video.release();
CvCapture* capture = cvCaptureFromAVI(videofilename.c_str());
IplImage* frame = cvQueryFrame(capture);
IplImage* currframe;
IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
if ( !capture )
{
std::cout << "Could not open video file" << std::endl;
return -1;
}
cvNamedWindow("dest", CV_WINDOW_AUTOSIZE);
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)
{
printf("Capture Finished\n");
break;
}
currframe = cvCloneImage(frame); // copy frame to current
frame = cvQueryFrame(capture); // grab frame
if(!frame)
{
printf("Capture Finished\n");
break;
}
cvSub(frame, currframe, destframe); // subtraction between the last frame to cur
cvShowImage("dest", destframe);
cvWaitKey(30);
cvReleaseImage(&currframe);
}
cvDestroyWindow("dest");
cvReleaseCapture(&capture);
return 0;
}
关于c++ - 打开简历;如何释放 IplImage*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20728977/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我开始在我的图像处理程序中使用 OpenCV。当我使用 cv::Mat 并在内存方法中分配时: cv::Mat coords(100, 5, CV_32FC1); 如果我不再需要,是否需要执行 coo
hibernate :插入数据文件(file_content、file_name、doc_title、resume_text、title、title_id、file_type)值(?、?、?、?、?、
我正在尝试为求职申请制作一份简历,现在我已经使用 CSS 创建了一个背景和一个小菜单。现在我的问题: 有没有办法不使用 ,,创建一个区域,我可以在不丢失菜单的情况下将我的链接定位到该区域。 当我学习
我正在运行这段代码: #include #include #include using namespace cv; using namespace std; int main( int argc
python 3.5 和 windows 10 我使用这个命令安装了 open cv : pip install opencv_python-3.1.0-cp35-cp35m-win_amd64.wh
我在 Linux Mint 上安装了 opencv 使用: sudo apt-get install python-opencv 当我尝试使用以下方法导入 opencv 模块时: from openc
我是否可以搜索特定日期提交的 CVS 文件列表? 我目前使用 opensuse 和 cvs 命令行,还使用 Eclipse IDE 处理我的 Java 内容。 最佳答案 您可以使用 Eclipse
当我执行 rtag 时,进程相当慢,消息 cvs rtag: [07:34:59] waiting for cvsuser's lock in ...;是什么导致了这个以及如何解决这个问题?提前致谢。
我使用 OpenCV 和 MATLAB 校准了带有棋盘格图案的相机。我在 OpenCV 和 MATLAB 中分别得到了 .489 和 .187 的平均重投影误差。从它的外观来看,MATLAB 更精确。
将一个 html 页面集成到另一个 html 页面的最简单方法是什么?我在我的个人网站上工作,我有一个正在编辑的模板。现在我找到了一个可以使用的免费简历 html 代码,但是当我尝试将它添加到我的网站
在 VS2015 中构建一个简单的 OpenCV 应用程序时出现错误 'cv': a namespace with this name does not exist while building 虽然
我是一名优秀的程序员,十分优秀!