pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000 * (a));
line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA);
imshow("边缘检测后的图", midImage);
imshow("最终结果图", dstImage);
}
waitKey();
return 0;
}
【问题】:
你会发现, 怎么图中一些很较着的的直线都没检测出来啊?
原因是, 我们阈值写的有点高了, 只有那些有足够的把握认为是直线的直线才可能检测出来 。
若是把阈值改为150, 直线检测结果就酿成如许子了 。
显然多了良多直线, 把那些“可能是直线”的直线都当做是直线了 。
所以, 阈值的选择很主要, 就看你是要切确查找仍是恍惚查找了 。
【注】:角度theta用的单元不是我们所说的度数(70度、80度), 而是数学上的π/2, π/3 。
文章插图
文章插图
4霍夫直线检测示例二:HoughLinesP
//与HoughLines分歧的是,
//HoughLinesP获得lines的是含有直线上点的坐标的,
//所以下面进行划线时就不再需要本身求出两个点来确定独一的直线了
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("2.jpg");
imshow("Src Pic", srcImage);
Mat midImage, dstImage;
Canny(srcImage, midImage, 50, 200, 3);
cvtColor(midImage, dstImage, CV_GRAY2BGR);
vector<Vec4i> lines;
HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);//注重第五个参数, 为阈值
//依次画出每条线段
for (size_t i = 0; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, CV_AA);
imshow("边缘检测后的图", midImage);
imshow("最终结果图", dstImage);
推荐阅读
- OpenCV:图像缩放操作resize,pryUp,pryDown
- OpenCV:重映射remap vs仿射变换warpAffine
- OpenCV:区域生长法实现
- OpenCV:calcHist计算图像直方图
- OpenCV例程:针对对比度差的图像,目标分割方法
- OpenCV:widthStep vs step
- OpenCV:TermCriteria迭代终止条件
- OpenCV:xml文件的读取与写入
- OpenCV:waitKey函数
- OpenCV:resize函数 VS vector:resize函数