mat.at<uchar>(i,j) 的 opencv C++ 矩阵赋值错误
Matrix assignement value error in opencv C++ with mat.at<uchar>(i,j)
我正在学习使用 C++ 中的 OpenCV 进行图像处理。要实现基本的下采样算法,我需要在像素级别上工作——删除行和列。但是,当我使用 mat.at<>(i,j) 分配值时,会分配其他值 - 诸如 1e-38.
这是代码:
Mat src, dst;
src = imread("diw3.jpg", CV_32F);//src is a 479x359 grayscale image
//dst will contain src low-pass-filtered I checked by displaying it works fine
Mat kernel;
kernel = Mat::ones(3, 3, CV_32F) / (float)(9);
filter2D(src, dst, -1, kernel, Point(-1, -1), 0, BORDER_DEFAULT);
// Now I try to remove half the rows/columns result is stored in downsampled
Mat downsampled = Mat::zeros(240, 180, CV_32F);
for (int i =0; i<downsampled.rows; i ++){
for (int j=0; j<downsampled.cols; j ++){
downsampled.at<uchar>(i,j) = dst.at<uchar>(2*i,2*j);
}
}
因为我在这里 OpenCV outputing odd pixel values 看到我需要投射 cout,所以我写了 downsampled.at<uchar>(i,j) = (int) before dst.at<uchar>
但它也不起作用。
cv::imread
的第二个参数是 cv::ImreadModes,所以行:
src = imread("diw3.jpg", CV_32F);
不正确;应该是:
cv::Mat src_8u = imread("diw3.jpg", cv::IMREAD_GRAYSCALE);
src_8u.convertTo(src, CV_32FC1);
这会将图像读取为 8 位灰度图像,并将其转换为浮点值。
循环应该如下所示:
Mat downsampled = Mat::zeros(240, 180, CV_32FC1);
for (int i = 0; i < downsampled.rows; i++) {
for (int j = 0; j < downsampled.cols; j++) {
downsampled.at<float>(i,j) = dst.at<float>(2*i,2*j);
}
}
注意cv::Mat::zeros
的参数是CV_32FC1
(1通道,32位浮点值),所以应该使用Mat::at<float>
方法。
我正在学习使用 C++ 中的 OpenCV 进行图像处理。要实现基本的下采样算法,我需要在像素级别上工作——删除行和列。但是,当我使用 mat.at<>(i,j) 分配值时,会分配其他值 - 诸如 1e-38.
这是代码:
Mat src, dst;
src = imread("diw3.jpg", CV_32F);//src is a 479x359 grayscale image
//dst will contain src low-pass-filtered I checked by displaying it works fine
Mat kernel;
kernel = Mat::ones(3, 3, CV_32F) / (float)(9);
filter2D(src, dst, -1, kernel, Point(-1, -1), 0, BORDER_DEFAULT);
// Now I try to remove half the rows/columns result is stored in downsampled
Mat downsampled = Mat::zeros(240, 180, CV_32F);
for (int i =0; i<downsampled.rows; i ++){
for (int j=0; j<downsampled.cols; j ++){
downsampled.at<uchar>(i,j) = dst.at<uchar>(2*i,2*j);
}
}
因为我在这里 OpenCV outputing odd pixel values 看到我需要投射 cout,所以我写了 downsampled.at<uchar>(i,j) = (int) before dst.at<uchar>
但它也不起作用。
cv::imread
的第二个参数是 cv::ImreadModes,所以行:
src = imread("diw3.jpg", CV_32F);
不正确;应该是:
cv::Mat src_8u = imread("diw3.jpg", cv::IMREAD_GRAYSCALE);
src_8u.convertTo(src, CV_32FC1);
这会将图像读取为 8 位灰度图像,并将其转换为浮点值。
循环应该如下所示:
Mat downsampled = Mat::zeros(240, 180, CV_32FC1);
for (int i = 0; i < downsampled.rows; i++) {
for (int j = 0; j < downsampled.cols; j++) {
downsampled.at<float>(i,j) = dst.at<float>(2*i,2*j);
}
}
注意cv::Mat::zeros
的参数是CV_32FC1
(1通道,32位浮点值),所以应该使用Mat::at<float>
方法。