fsociety_ 2024-08-07 10:15 采纳率: 28.6%
浏览 33

使用opencv时cv::Size作为参数传递报段错误

代码片段1:我自己的代码,调用了opencv里的函数

cv::Size sz(3, 3);
std::cout << "sz: " << &sz << std::endl;
GaussianBlur(frame, frame, sz, 0, 0);

代码片段2:opencv4.5.3源码,其中有我自定义的部分



void GaussianBlur(InputArray _src, OutputArray _dst, Size ksize,
                  double sigma1, double sigma2,
                  int borderType)
{
    CV_INSTRUMENT_REGION();
    std::cout << "ksize: " << &ksize << std::endl;
    CV_Assert(!_src.empty());

    int type = _src.type();
    Size size = _src.size();
    _dst.create( size, type );

    if( (borderType & ~BORDER_ISOLATED) != BORDER_CONSTANT &&
        ((borderType & BORDER_ISOLATED) != 0 || !_src.getMat().isSubmatrix()) )
    {
        if( size.height == 1 )
            ksize.height = 1;
        if( size.width == 1 )
            ksize.width = 1;
    }
        .....
}

编译器:arm-linux-gnueabi-g++
交叉编译生成了opencv的静态库,然后编译自己的代码生成可执行文件
在板端执行后的打印:

img

可以看到,GaussianBlur函数内ksize的地址变为了0x3,这个地址是不对的,后面调用ksize时直接就段错误了。
GaussianBlur函数的参数Size是值传递,按理说不应该发生段错误,现在找不到原因。
虽然可改opencv源码来解决,但是还是想知道为什么会这样,请教大家,谢谢。

  • 写回答

1条回答 默认 最新

  • 一直免费一直爽 2024-08-11 20:32
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题是由C++中指针复制导致的。当cv::Size对象被赋值给一个指针时,它实际上创建了一个指向新内存区域的对象。如果你尝试访问这些对象,就会出现问题。

    为了解决这个问题,你需要确保在传入cv::Size对象之前释放原始内存,并在传入新的cv::Size对象后重新分配内存。例如:

    cv::Size original_size(3, 3); // 创建原大小的cv::Size对象
    cv::Size* new_size = &original_size; // 将原大小的cv::Size对象转换为指针
    // ...
    
    new_size->width = width; // 更新宽度
    new_size->height = height; // 更新高度
    

    这将确保每次操作都会从一个新的、独立的内存块开始,从而避免指针复制问题。

    此外,你应该检查传入cv::Size对象的类型是否与返回结果类型兼容。例如,如果你传入的是int类型的cv::Size对象,那么返回的结果应该是int类型的,否则可能会引发类型不匹配的错误。

    cv::Size original_size(3, 3); // 创建原大小的cv::Size对象
    cv::Size result = cv::Size(original_size.width, original_size.height); // 使用传入的原大小创建新的cv::Size对象
    
    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 8月7日
  • 创建了问题 8月7日