Canny边缘检测后设置BGR(255,0,0)轮廓仍显白色的问题排查
问题分析与解决
核心问题
你用CvInvoke.Canny得到的cannyImage是单通道灰度图像(8位单通道,8UC1),而你传入的MCvScalar(255,0,0)是BGR三通道颜色值。在单通道图像上绘制时,OpenCV只会取颜色的第一个通道值(也就是255),所以轮廓会显示为白色(灰度图中255对应白色)。
解决步骤
要显示蓝色轮廓,需要先把单通道的Canny结果转换成三通道彩色图像,再在彩色图上绘制轮廓:
- 将单通道的
cannyImage转换为三通道的BGR图像 - 在三通道图像上调用
DrawContours,此时BGR颜色值才会生效
修改后的代码
private void Capture_ImageGrabbed1(object sender, EventArgs e) { try { Mat m = new Mat(); capture.Retrieve(m); pic1.Image = m.ToImage<Bgr, byte>().Bitmap; if(mode == 1) { var image = m.ToImage<Bgr, byte>(); var grayScaleImage = image.Convert<Gray, byte>(); var blurredImage = grayScaleImage.SmoothGaussian(5, 5, 0, 0); var cannyImage = new UMat(); CvInvoke.Canny(blurredImage, cannyImage, 10, 50); // 新增:将单通道Canny图转为三通道彩色图 var cannyColor = new UMat(); CvInvoke.CvtColor(cannyImage, cannyColor, Emgu.CV.CvEnum.ColorConversion.Gray2Bgr); VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); CvInvoke.FindContours(cannyImage, contours, null, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple); // 在三通道图上绘制轮廓,此时BGR颜色生效 CvInvoke.DrawContours(cannyColor, contours, -1, new MCvScalar(255, 0, 0), 2); pic2.Image = cannyColor.Bitmap; } } catch (Exception) { throw; } }
补充说明
- 单通道图像只有亮度信息,没有色彩通道,所以无法显示彩色内容
CvtColor(cannyImage, cannyColor, Gray2Bgr)会把单通道灰度图复制到三通道的每个通道,得到一个灰度色调的彩色图,此时再绘制BGR颜色的轮廓就能正确显示蓝色
内容的提问来源于stack exchange,提问作者user20256782
相关产品推荐
相关产品推荐

