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);
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐