我在进行霍夫直线检测学习时,最开始通过imread载入一张灰度图,后面在调用Canny(),在进行霍夫直线检测,最后通过for循环将每一根直线绘制出来,但是程序运行结果却是什么也没有绘制,直至我把imread那的第二个参数从IMREAD_GRAYSCALE改为IMREAD_COLOR(也就是默认值),程序运行结果才正常,想问问原因
问题相关代码,请勿粘贴截图
void hough_linesp_demo()//统计概率霍夫线变换
{
Mat src = imread("G:/CV/images/morph01.png", IMREAD_GRAYSCALE);
//调用imread读入一张灰色图片(用于直线检测的图片)
Mat binary;
Canny(src, binary, 80, 160, 3, false);
namedWindow("binary", WINDOW_AUTOSIZE);
imshow("binary", binary);
vector<Vec4i>lines;
HoughLinesP(binary, lines, 1, CV_PI / 180, 80, 200, 10);
Mat result = Mat::zeros(src.size(), src.type());
for (int i = 0; i < lines.size(); i++)
{
line(result, Point(lines[i][0], lines[i][1]),Point(lines[i][2],lines[i][3]), Scalar(0, 0, 255), 2, 8);
}
//利用for循环来绘制每一根直线,按照预期应该是正常显示,但是代码运行下什么都没绘制
imshow("Hough_linesp", result);
waitKey(0);
destroyAllWindows();
我后面以为是canny要输入8bit的非单通道图像,但是我通过imread载入一张3通道8bit的默认图片,再用cvtColor(src,gray,BGR2GRAY),将其转为灰度图像,想测试一下我的猜想(按照我的猜想应该也是不能绘制的),但是运行结果打脸了,这顿操作后,程序正常运行
求个解释,难道imread载入的灰度图和cvtColor()转换后的灰度图不是一回事吗,有什么区别
(1)如果只是 imread 载入灰度图与 cvtColor() 转换灰度图问题,跟 Hough 转换什么的都没有关系。你在程序开头,分别用这两种方法获取图像,显示出来比较一下就可以,也可以逐像素比较。一般来说,不会有很大差异,至少不会如你问题中的差异那么大。
(2)我猜想是在后面的处理过程中,src 被修改了。为此,你可以在 imread 载入灰度图程序中加一行,将 src 复制到另一变量:
gray = src.copy() # 这是 python 程序,请修改为 C
接下来使用最后一段程序 (即 cvtColor(src,gray,BGR2GRAY) 之后的程序),看看结果,你就明白了。
应该是一样的,载入的也是正常图片转出来的,不放心你可以image watch(vs插件,可以安装到vs)对比一下,可以像素对比,或者你两张图片直接相减看看差值。