【发布时间】:2021-12-17 18:02:41
【问题描述】:
我正在尝试创建卷积函数,但在访问内核数据 (cv::Mat) 期间遇到了问题。
我创建了 3x3 内核:
cv::Mat krn(3, 3, CV_32FC1);
krn.setTo(1);
krn = krn/9;
然后我尝试遍历它。接下来image Mat 将是我要应用卷积运算符的图像,输出将是卷积的结果:
for (int r = 0; r < image.rows - krn.rows; ++r) {
for (int c = 0; c < image.cols - krn.cols; ++c) {
int sum = 0;
for (int rs = 0; rs < krn.rows; ++rs) {
for (int cs = 0; cs < krn.cols; ++cs) {
sum += krn.data[rs * krn.cols + cs] * image.data[(r + rs) * image.cols + c + cs];
}
}
output.data[(r+1)*src.cols + c + 1]=sum; // assuming 3x3 kernel
}
}
但是输出不是我们想要的(只有随机的黑白像素)。 但是,如果我以这种方式更改我的代码:
for (int r = 0; r < image.rows - krn.rows; ++r) {
for (int c = 0; c < image.cols - krn.cols; ++c) {
int sum = 0;
for (int rs = 0; rs < krn.rows; ++rs) {
for (int cs = 0; cs < krn.cols; ++cs) {
sum += 0.11 * image.data[(r + rs) * image.cols + c + cs]; // CHANGE HERE
}
}
output.data[(r+1)*src.cols + c + 1]=sum; // assuming 3x3 kernel
}
}
使用0.11 代替内核值似乎可以提供正确的输出。
出于这个原因,我认为我在访问内核数据时做错了。
P.S:我不能使用krn.at<float>(rs,cs)。
谢谢!
【问题讨论】:
-
krn.at
(rs,cs) - 尝试以这种方式访问内核数据 -
谢谢,我会添加到主帖中,但我不能使用它。
-
float* kernel_float_data = (float*)krn.data - 然后像你一样访问你的内核。
-
很好,谢谢!在您看来,opencv convertTo() 函数还有其他方法吗?谢谢!
-
convertTo() 方法不影响“数据”字段的类型。