[英]Segmentation fault in opencv copyTo
由于opencv内置的填充函数不适用于任何多维矩阵,因此我必须自己编写它:
cv::Mat PadImage(const cv::Mat& input, int pad_h, int pad_w)
{
int padded_size[3];
padded_size[0] = input.size[0] + 2 * pad_h;
padded_size[1] = input.size[1] + 2 * pad_w;
padded_size[2] = input.size[2];
cv::Range ranges[3];
ranges[0] = cv::Range(pad_h, padded_size[0] - pad_h);
ranges[1] = cv::Range(pad_w, padded_size[1] - pad_w);
ranges[2] = cv::Range(0, input.size[2]);
cv::Mat input_padded(3, padded_size, input.type(), 0);
// segmentation fault here at this call !
input.copyTo(input_padded(ranges));
return input_padded;
}
我假设输入矩阵有3个维度,并且填充仅在维度1&2中完成。
当我使用不同类型的矩阵调用此函数时,出现分段错误(在调用copyTo的行),我无法弄清楚原因。 测试代码示例:
int size[3] = {61, 29, 32};
cv::Mat X(3, size, CV_8UC1, 0);
cv::Mat X_ = PadImage(X, 1, 1);
您为cv::Mat
触发了错误的构造函数,当您尝试使用0初始化矩阵时,请始终记住还有另一个构造函数需要原始指针
Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);
因此,如果您更正以下两行,则应该能够获得所需的内容
cv::Mat input_padded(3, padded_size, input.type(), cv::Scalar(0));
cv::Mat X(3, size, CV_8UC1, cv::Scalar(0));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.