- 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/
是否可以使用 OpenCv (JavaCv) 将图像放入图像中。例如,我有一张 1000x1000 的图像和一张 100x100 的图像。在 600x600 的位置,我想将较小的图像放在较大的图像中。
我必须在内存中保存预定义数量的图像。我创建了一个像这样的数组: int nb_frame_decalage=10; IplImage** accumulateur_image; CvCapture*
我想使用下面的代码保存一个 IplImage(不是 IplImage*) IplImage ipl_from_mat((IplImage)imgDisparity8U); cvNamedWindow(
我需要将 8 位 IplImage 转换为 32 位 IplImage。使用来自整个网络的文档,我尝试了以下操作: // general code img2 = cvCreateImage(cvSiz
当我尝试使用 cvCopy 将一个由 3 个 channel 组成的 IplImage 复制到一个具有 4 个 channel 的 IplImage(我稍后需要额外的 channel )时,我得到的只
我有一个 8 位的 IplImage,我想将它转换为 24 位的 IplImage。我该怎么做? 最佳答案 假设您的灰度图像位于名为 image 的变量中 - IplImage *rgbimage =
我想知道在 opencv 中裁剪 IplImage 的最有效方法是什么。我目前正在执行以下操作,但它似乎太复杂了,我确信有更好的方法。 // set ROI on original image
该代码用于8位数据,以生成灰度IplImage。 IplImage* img_gray_resize = NULL; img_gray_resize = cvCreateImage(c
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我有一个变量 char* ImgMem,它包含所需图像的图像内存(三个 channel /RAW 16),我想将它分成三个并将每个在单 channel 的 IplImage 中:一个用于 R,一个用于
是否有一种简单且成本低廉的方法可以沿 y 轴翻转 IplImage?我正在使用高帧率。 最佳答案 cvFlip(参见 Operation On Arrays )可以原地翻转。支持水平、垂直和组合翻转。
如何使用 OpenCV 获得最清晰的 iplimage?当没有训练图像进行比较时。 例如,有一个移动手的网络摄像头输入。但是当我播放这个视频时,我得到了 10 个 iplimages。但只有第五个更清
我像这样在 IplImage 上绘制对象: cvLine(image, point_1, point_2, color, thickness, CV_AA); // Line cvCircle(mag
我正在尝试从通过 USB 连接到 Raspberry Pi 的罗技高清摄像头捕获帧,RP 正在运行 arch linux,我正在使用 OpenCV C api 和 TCP 客户端。 TCP服务器在ub
当我们有一个 IplImage ,我们如何保存它以便以后使用,或者在我们的代码之外将其作为图像查看(例如通过 png 或 jpeg)? 作为代码示例,我有以下内容: void SaveImage()
OpenCV 中的IplImage 是什么?你能解释一下它作为一种类型的含义吗?我们应该什么时候使用它? 谢谢。 最佳答案 根据您在问题中的“c++”标签:你不应该使用它,你应该使用 cv::Mat。
不知道为什么会这样。方法 : IplImage.createFrom(image); 正在挂起而没有返回任何值。我尝试了多个图像,并确认了它们的存在。我正在编写一个利用模板匹配的应用程序,但是这个第一
我正在尝试对图像应用概率霍夫变换,但出现此编译器错误: invalid initialization of reference of type ‘cv::InputArray {aka const c
我正在Visual Studio 2012上使用OpenCV2.4.5和OpenNI2.0(带有SDK Kinect 1.6)。我尝试开发凝视跟踪应用程序,因为我使用“Kinect传感器”获取imag
我尝试将黑白 UIImage 转换为 IplImage,但从控制台提供这些。可以做什么? CGBitmapContextCreate: unsupported parameter combinatio
我是一名优秀的程序员,十分优秀!