我正在尝试手动更改Mat中的每个像素。
为了简单起见,假设我要为每个像素上黑。我正在使用以下方法:
for (int i = 0; i < imageToWorkWith.rows; i++) {
for (int j = 0; j < imageToWorkWith.cols; j++) {
imageToWorkWith.at<cv::Vec3b>(i,j) = cv::Vec3b(0,0,0);
}
}
从逻辑上讲,这似乎应该遍历垫子中的每个像素,因为它会读取行/列的所有可能组合。
不幸的是,这行不通。对于每个图像,我都缺少一列“块”。例如,加载此图像时:
结果是这样的:
无论我使用什么图像,我都会丢失的“块”大小相同。我似乎无法理解其原因。我知道“at”功能的行/列的顺序是(行,列),但是我尝试仅将它们切换为踢,结果当然更糟。
我在这里想念什么?遍历所有行/列不够吗?
最佳答案
只需使用Vec4b而不是Vec3b,因为默认情况下,该图像在ios中有4个通道。结果将为全白色。
for (int i = 0; i < imageToWorkWith.rows; i++) {
for (int j = 0; j < imageToWorkWith.cols; j++) {
imageToWorkWith.at<cv::Vec4b>(i,j) = cv::Vec4b(0,0,0);
}
}