由于opencv内置填充函数不适用于任何多维矩阵,我必须自己编写:
<img src="http://i.imgur.com/ZKEqcWm.jpg" id = "rotating_image">
我假设输入矩阵有3个维度,填充仅在1和2维中完成。
当我用不同类型的矩阵调用此函数时,我得到分段错误(在调用copyTo的行),我无法弄清楚原因。 测试代码示例:
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;
}
答案 0 :(得分:2)
你为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));