我一直在尝试比较 IplImage 对象中的数据内容。
我有以下内容:
IplImage img1 = IplImage(cv::imread("C:\\TestIm\\barrier_snapshot1.png"),
CV_LOAD_IMAGE_GRAYSCALE);
for (int i=0; i < img1.widthStep * img1.height; i++) {
cout << img1.imageData[i] << endl;
}
但是当我尝试打印它时,它会导致异常,我什至无法捕获它来打印消息并查看我做错了什么。我的图像是灰度的,我相信如果我不使用 cvCreateImage() 可以吗?我知道这将是一些愚蠢的或与数组访问相关的事情,我似乎无法从 IplImage 文档中轻松获得。
*为什么我要在我的设计中混合使用 C 和 C++ 代码?*
不幸的是,我别无选择!我正在开发一个具有改进的运动检测应用程序的项目。我的遗留应用程序源代码使用大量的 BOOST 和 OpenCV 东西。特别是,它使用 IplImage*(我讨厌它,让生活变得困难并导致内存泄漏)来存储图像掩码之类的东西。我了解如果我长期保存 IplImage*,我将遇到非法引用和访问冲突。所以我保存了 IplImage* 指向的实际内容的副本。举例说明:
// getLongHistory() returns IplImage*
IplImage history_long = *(motionHistory.getLongHistory());
共有 6 个使用 IplImage* 制作的蒙版图像。此时此刻,我在谴责决定在 IplImage* 中这样做的程序员。当我尝试加载这些蒙版图像时会出现问题,这就是我的做法:
// Passing pointer to the address of the mask stored (alive in the memory)
motionHistory.setLongHistory(&(matcher.getCurrentSceneObject().getLongHistory()));
我相信我对 IplImage 对象的深拷贝和浅拷贝有问题。我相信将其保存为IplImage * 中的 cv::Mat 并从 cv::Mat 将其加载为 IplImage* 可能会减轻负担,因为我怀疑它可能在高级函数下做了一些事情,以便复制数据和 ROI相应地完成。但是,作为一个新手,我可以假设任何事情。请帮忙!
更新
在我的代码中,我过去是这样做的:
/* I store all my mask images in a vector of pairs made of <int, IplImage>
* __MASK_LONG__ etc. are predefined intergers
* getMaskLong() etc. methods return IplImage* to the respective mask images.
*/
myImages.clear(); // To make sure that I have no extra stuff
myImages.push_back(std::make_pair<int, IplImage>(_MASK_LONG_, maskHistory.getMaskLong()));
myImages.push_back(std::make_pair<int, IplImage>(_MASK_SHORT_, maskHistory.getMaskShort()));
然而,在得到建议并做了一些基本的 R&A 之后,我现在这样做是为了防止浅拷贝:
myImages.clear();
myImages.push_back(std::make_pair<int, IplImage>(_MASK_LONG_, *cvCloneImage(maskHistory.getMaskLong())));
myImages.push_back(std::make_pair<int, IplImage>(_MASK_SHORT_, *cvCloneImage(maskHistory.getMaskShort())));
我可以确认这是可行的,因为我可以看到 OpenCV 窗口上加载了最新的蒙版图像!而且我很确定在任何编程任务中至少进行 2/3 次深度复制是多么重要。所以感谢你让我走上正轨。但是现在我遇到了在实施这些更改时想到的问题 - 内存分配失败。并且遇到了消息:
OpenCV Error: Insufficient memory (Failed to allocate 3686404 bytes) in OutOfMemoryError,
file /home/naresh/OpenCV-2.4.0/modules/core/src/alloc.cpp, line 52
如果我对 C/C++ 有足够的了解,首先我犯了将它们混合在一起的罪行(我别无选择!!这是一个遗留应用程序!)。其次,存在不匹配,即 alloc.cpp 文件(产生问题的地方)中对 malloc/free 的调用不正确。或者可能只是堆已损坏或已满。我是不是很傻?