我将使用OpenCV的级联训练功能。 但在此之前,我需要准备培训数据。 我只是想知道如果我的阳性样本具有透明度,OpenCV是否可以支持它?例如,如果我想让分类器了解车辆的外观,那么我可以提供车辆站在透明背景上的正样本图像吗?
答案 0 :(得分:1)
如上面的评论所述,haar要素仅在灰度图像上计算。如果你提到的话,这可能会造成问题,当默认颜色为0可能会导致“轮子”失去对比度。您可以“标准化”透明颜色,而不是默认为0。
首先,您可以加载所有4个通道(包括Alpha通道),然后使用Alpha通道将透明部分设置为特定值。
I = cv2.imread("image.jpg", cv2.CV_LOAD_IMAGE_UNCHANGED)
alpha = I[:, :, 3]
G = cv2.cvtColor(I, cv2.COLOR_BGRA2GRAY)
G[alpha == 0] = 125 # Set transparent region to 125. Change to suit your needs.
vector<cv::Mat> channels;
cv::split(I, channels);
cv::Mat alpha = channels[3];
alpha = 255 - alpha; // Invert mask so we select the transparent regions.
cv::Mat G = cv::cvtColor(I, cv::COLOR_BGRA2GRAY);
G.setTo(cv::Scalar(125), alpha);
作为一个警告,我认为您可能必须小心上面的一些操作,例如,使用alpha加载图像和“alpha = 255 - alpha;”。我相信它们仅在OpenCV的更高版本中可用。我正在使用OpenCV 2.4.7并且它可以工作(对于python版本。我没有尝试过C ++,但它应该是相同的)。因此,如果事情不起作用,请检查您的OpenCV版本是否支持这些操作。如果没有办法绕过它们。