内存位置

时间:2016-09-08 06:49:24

标签: c++ visual-studio opencv memory-management out-of-memory

我的项目已经很大了,因为它正在从另一个项目中使用,所以我将无法添加整个代码。 我正在使用Visual Studios 2015,OpenCV-3.1.0和OpenNI2。

通过调试,我能够找到导致此处显示错误的确切行:

enter image description here

此错误发生在以下代码行:

    cvRectangle(&img_8bit, (pt1.x,pt1.y), (pt2.x,pt2.y), CV_RGB(255, 255, 255), -1);

下一个图像显示在执行该行之前每个变量中都有数据,它还显示每个变量的数据类型:

enter image description here

我已经查看了此论坛上出现过的关于类似问题的其他一些帖子,但未能找到适用于我的案例的解决方案。

我尝试通过将它们分成x和y变量而不是仅仅说pt1和pt2来改变输入两点的方式。 我也试图改变图像的输入方式,但没有成功。

任何人都可以判断问题是与变量或矩形函数相关的问题,还是其他问题?

- - - - EDIT ------------------ 我已经能够用较少量的代码重新创建错误,以便可以显示所有内容。 请注意,如果cvRectangle线被注释掉,那么它将完全显示存储位置的所有图像。

#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include <iostream>
#include <sstream>
#include <Windows.h>
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{

    int nFrame = 0;//Current is the first few frames
    cv::Mat depthMap;
    char m_hitKey = 0;
    char image_name[100];
    CvPoint pt1, pt2;
    pt1.x = 31;
    pt1.y = 89;
    pt2.x = 96;
    pt2.y = 119;

    for (int filenum = 0; filenum< 2276; filenum++)
    {
        ++nFrame;//This is the first record at a few frames
        std::sprintf(image_name, "%s%d%s", "C:\\Users\\James Mallett\\Dep\\dep-", filenum, ".png");

        depthMap = cv::imread(image_name, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);

        if (m_hitKey = cv::waitKey(50))//Analyzing Key

        {
            if (m_hitKey == 27)
            {
                break;
            }
        }
        cvRectangle(&depthMap, pt1, pt2, CV_RGB(255, 255, 255), -1);
        cv::imshow("RGB", depthMap);
    }

    cv::destroyAllWindows();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

在你的例子中:

cvRectangle(&depthMap, pt1, pt2, CV_RGB(255, 255, 255), -1);

这看起来非常错误,因为the signature I found online是的,这是早期版本的文档,但是this hasn't changed)是......

void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 )

...而depthMap的类型为cv:Mat。使用名为cv:rectangle的匹配签名调用C ++函数,如此...

cv:rectangle(depthMap, pt1, pt2, CV_RGB(255, 255, 255), -1);

......会更有意义。

CvArr是 - according to the docs - &#34;元类型&#34; (这是一个愚蠢的API选择,IMO),因此它可能指向plImage*CvMat*甚至CvSeq*中的任何一个。请注意,该列表中的cv:Mat 不是。我在本网站上发现了一个问题,详细说明了如何c onvert between these类型。