gpt4 book ai didi

c++ - opencv Mat重新分配内存损坏

转载 作者:太空宇宙 更新时间:2023-11-04 13:57:47 25 4
gpt4 key购买 nike

我在为opencv包装函数的发行版而苦苦挣扎。
功能代码运行良好,但是一旦完成功能块,就会发生内存访问冲突。
在 Debug模式下不会出现此问题。段错误在释放堆时发生。

int Myfunc(Arr1D_floatHdl FeatArrHdl, IMAQ_Image *img, someparams 
*Params)
{
ImageInfo *Info = NULL;
//IplImage *CVImage = NULL;
Info = (ImageInfo*)img->address;
CheckImage(Info, Info);
//CVImage = cvCreateImageHeader( cvSize(Info->xRes, Info->yRes), IPL_DEPTH_8U, 4);
//CVImage->imageData = (char*)Info->imageStart;
//CVImage->widthStep = Info->xRes*sizeof(IPL_DEPTH_8U);
cv::Mat BGRAimg = cv::Mat(Info->yRes, Info->xRes, CV_8UC4, (char*)Info->imageStart, sizeof(CV_8UC4)*Info->xRes);
//cv::Mat BGRAimg(CVImage);
//cv::Mat BGRAimg = imread( "MyImg.png", cv::IMREAD_COLOR );
cv::Mat GREYimg;
cv::cvtColor(BGRAimg, GREYimg, CV_BGR2GRAY);

这是我根据用户提供的数据创建Mat对象的代码。
我尝试先创建IplImage(代码中的注释版本),然后将Mat构造函数与IplImage参数一起使用,但又遇到了同样的问题。
我知道在Mat构造过程中我做错了很多事,因为从磁盘手动加载镜像不会引起问题。

创建Mat对象后,其所有参数均正确且图像良好。与它创建的灰色矩阵进行比较时,它具有refcount NULL,我读过它很好,因为它应该保持用户数据完整。

请帮忙。

更新以提供更多信息

谢谢你的建议。我显然很容易产生这样的错误,我是C / C++的新手。
不幸的是,访问冲突仍然存在。

这是完整的包装函数。我试图缩小问题范围,并跳过HOG.compute函数,但我不再遇到内存损坏的问题。最终跳过了memcpy杂技,我仍然会损坏内存。
int GetHOGFeatures(Arr1D_floatHdl FeatArrHdl, IMAQ_Image *img, HogParams *Params) //returns -1 on HOG window parameters missmatch
{
ImageInfo *Info = NULL;
Info = (ImageInfo*)img->address;
CheckImage(Info, Info);

cv::Mat BGRAimg = cv::Mat(Info->yRes, Info->xRes, CV_8UC4, (char*)Info->imageStart, sizeof(cv::Vec4b)*Info->xRes);
cv::Mat GREYimg;
cv::cvtColor(BGRAimg, GREYimg, CV_BGRA2GRAY);

//set params into hog object
cv::HOGDescriptor hog;
hog.winSize = cv::Size(Params->winsize_width, Params->winsize_height);
hog.blockSize = cv::Size(Params->blocksize_width, Params->blocksize_height);
hog.blockStride = cv::Size(Params->blockstride_x, Params->blockstride_y);
hog.cellSize = cv::Size(Params->cellsize_width, Params->cellsize_height);
hog.nbins = Params->nBins;
hog.derivAperture = Params->derivAperture;
hog.winSigma = Params->win_sigma;
hog.L2HysThreshold = Params->threshold_L2hys;
hog.gammaCorrection = (Params->gammaCorrection != 0);

MgErr error = mgNoErr;

cv::vector<float> ders;
cv::vector<cv::Point> locations;

try
{
//winstride - step of window
//padding - borderpadding
//raises exception with incorrect params ... todo replace trycatch with paramchecking
hog.compute(GREYimg, ders, cv::Size(Params->winstride_x, Params->winstride_y), cv::Size(0,0), locations);
}
catch(...)
{
return -1;
}
//copy out the data into LabView
error = DSSetHandleSize(FeatArrHdl, sizeof(int32_t) + ders.size()*sizeof(float));
memcpy((*FeatArrHdl)->Arr, ders.data(), sizeof(float)*ders.size());
(*FeatArrHdl)->dimSize = ders.size();

return error;

}

我正在使用以下参数运行此功能:

窗户尺寸32
块大小16
像元大小8
大步8

大步向前32

其余参数为默认值。

我决定将Mat对象一旦构造后的外观包括在内,希望对您有所帮助。

这是根据用户数据构造的BGRA。应该是640 * 640 BGRA
  • BGRAimg {flags = 1124024344昏暗= 2行= 640 ...} cv::Mat
    标志1124024344 int
    暗淡2 int
    640行
    cols 640 int
  • data 0x12250040“e9%” unsigned char *
    101'e'unsigned char
  • refcount 0x00000000整数*
    CXX0030:错误:无法评估表达式
  • datastart 0x12250040“e9%”未签名字符*
    101'e'unsigned char
  • dataend 0x123e0040“”未签名的字符*
    0个未签名的char
  • datalimit 0x123e0040“”无符号字符*
    0个未签名的char
  • 分配器0x00000000 cv::MatAllocator *
    __vfptr CXX0030:错误:无法评估表达式
  • 大小{p = 0x0012f44c} cv::Mat::MSize
  • p 0x0012f44c int *
    640 int
  • 步骤{p = 0x0012f474 buf = 0x0012f474} cv::Mat::MStep
  • p 0x0012f474 unsigned int *
    2560 unsigned int
  • buf 0x0012f474 unsigned int [2]
    [0] 2560无符号整数
    [1] 4个未签名的int

  • 进入HOG描述符计算器的灰色图像
  • GREYimg {flags = 1124024320昏暗= 2行= 640 ...} cv::Mat
    标志1124024320 int
    暗淡2 int
    640行
    cols 640 int
  • refcount 0x0c867ff0 int *
    1个int
  • dataend 0x0c867ff0“”未签名的字符*
    1''unsigned char
  • datalimit 0x0c867ff0“”无符号字符*
    1''unsigned char
  • 分配器0x00000000 cv::MatAllocator *
    __vfptr CXX0030:错误:无法评估表达式
  • 大小{p = 0x0012f40c} cv::Mat::MSize
  • p 0x0012f40c int *
    640 int
  • 步骤{p = 0x0012f434 buf = 0x0012f434} cv::Mat::MStep
  • p 0x0012f434 unsigned int *
    640位未签名的int
  • buf 0x0012f434 unsigned int [2]
    [0] 640个无符号整数
    [1] 1个未签名的int

  • 我不得不省略data和datastart字段,因为与BGRA图像不同,MSVS实际上在其中显示了一些数据。

    UPDATE2

    在项目属性中将多线程DLL更改为多线程,问题就解决了。

    即使我使用的是这样的代码,问题仍然存在:
    int dim = 32;
    BYTE *mydata = NULL;
    mydata = (BYTE*)malloc(sizeof(BYTE)*dim*dim);
    Mat img;
    img = Mat(Size(dim,dim), CV_8U, mydata, dim*sizeof(BYTE));

    可能表明我的代码不是原因,这可能是opencv x Windows运行时问题,还是我只是隐藏了问题?

    UPDATE3

    在阅读了有关Microsoft运行时的一些知识之后,我决定检查一下opencv是如何构建的,它使用的是/ MD,还是使用/ MT进行的。我希望这是原因。

    最佳答案

    这可能无法按您期望的那样工作:

    sizeof(CV_8UC4)*Info->xRes

    CV_8UC4是一个枚举,而不是类型,您不能在此处使用sizeof()。

    如果您的数据是连续的,则可能完全跳过了跨步参数,或者:
    sizeof(Vec4b)*Info->xRes

    另一件事:

    您的BGRAimg有4个 channel ,对吗?因此,使用
    cv::cvtColor(BGRAimg, GREYimg, CV_BGRA2GRAY);

    代替

    关于c++ - opencv Mat重新分配内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671007/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com