opencv中imread读取二值图
opencv中imread二值图读取出来不是单通道,而是3通道,所以直接使用单通道图像来进行后面的计算会出错。Rect2i rect;Mat srcMask = imread("images/mask.png");FindBoundingBox(srcMask, rect);FindBoundingBox之后,使用rect.x, rect.y怎么都不对,开始没想到是三通道的问题,检查了下FindB
·
opencv中imread二值图读取出来不是单通道,而是3通道,所以直接使用单通道图像来进行后面的计算会出错。
Rect2i rect;
Mat srcMask = imread("images/mask.png");
FindBoundingBox(srcMask, rect);
FindBoundingBox之后,使用rect.x, rect.y怎么都不对,开始没想到是三通道的问题,检查了下FindBoundingBox,没有问题
Mat dumpMask = Mat::zeros(mask.rows, mask.cols, CV_8U);
for (int h = 0; h < mask.rows; h++) {
for (int w = 0; w < mask.cols; w++) {
if (mask.at<uint8_t>(h, w) > 0) {
dumpMask.at<uint8_t>(h, w) = 160;
}
}
}
然后加入了上面代码根据已有mask生成新的mask,发现问题,原来是imread读出来的是3通道。
打印读出来的mask chaneel也验证了这一点。
cout << "mask channels:" << srcMask.channels() << endl;
解决办法
IMREAD_COLOR和IMREAD_GRAYSCALE分别对应3通道和单通道
Mat src = imread("../images/src.png", IMREAD_COLOR);
Mat dst = imread("../images/dest.png", IMREAD_COLOR);
Mat mask = imread("../images/mask.png", IMREAD_GRAYSCALE);
也可以对3通道图像进行二值化
Mat srcMask;
Mat mask = imread("../images/mask.png");
cvtColor(mask, srcMask, COLOR_BGR2GRAY);
threshold(srcMask, srcMask, 0, 255, cv::THRESH_BINARY);
更多推荐
所有评论(0)