我有一个CvVideoCamera,我试图检测每个帧中的蓝色,输出帧应该只包含蓝色对象,比如这里。我是在委托方法中这样做的:
- (void)processImage:(cv::Mat&)image
{
cv::Mat bgrMat;
cvtColor(image, bgrMat, CV_BGRA2BGR);
// Covert color space to HSV
cv::Mat hsvMat;
cvtColor(bgrMat, hsvMat, CV_BGR2HSV);
// Threshold the HSV image
cv::Mat blueMask;
cv::Scalar lower_blue(110, 50, 50);
cv::Scalar upper_blue(130, 255, 255);
cv::inRange(hsvMat, lower_blue, upper_blue, blueMask);
bitwise_and(bgrMat, bgrMat, image, blueMask);
}原始图像:

结果:

蓝色检测似乎工作正常,但最终结果是红色而不是蓝色。知道为什么吗?我正确地使用了bitwise_and吗?
编辑
这几句台词很管用:
cv::Mat output;
image.copyTo(output, blueMask);
output.copyTo(image);而不是:
bitwise_and(bgrMat, bgrMat, image, blueMask);感谢卡洛利普的建议。由于某些原因,bgrMat在执行过程中会被“更改”,所以我使用的是原始的image。
发布于 2014-08-03 16:51:42
我认为你想要完成的是使用蓝色掩码从输入图像中复制像素,对吗?将结尾处的代码调整为:
cv::inRange(hsvMat, lower_blue, upper_blue, blueMask);
cv::Mat output;
bgrMat.copyTo(output, blueMask);https://stackoverflow.com/questions/25106578
复制相似问题