指针式仪表识别(二)基于轮廓的倾斜仪表校正

该文利用OpenCV进行图片处理,通过轮廓提取和直线检测校正倾斜的仪表图片。首先使用HoughLinesP检测直线,然后通过直线间的垂直关系滤除误检,计算边缘直线的倾斜角度,最后旋转图像以校正仪表的倾斜。
摘要由CSDN通过智能技术生成

本文将介绍如何利用OpenCV,提取图片中的矩形轮廓特征并进行图片的倾斜校正。完成demo程序可以至:基于轮廓的倾斜仪表校正

本demo所处理的图片是一张仪表(如下图),欲实现的功能是将图片中倾斜的PCB校正为水平。基本的思路是检测PCB的边缘直线,而后根据边缘直线的斜率旋转图片。但是由于仪表上存在指针,所以图片在经过轮廓提取直线检测后,会误检出很多条直线。demo程序中主要的算法就是从含有噪声的直线簇中提取出直线中相互垂直的直线。 
    

Step1: 直线检测。OpenCV提供了一个检测直线的函数HoughLinesP(),关于此函数的API介绍,可以参考HoughLinesP。此步骤主要程序如下:

Mat imgOrigion = imread(IMAGE_PATH);
Mat imgScale;
float scaleFactor = COLSLIMIT / imgOrigion.cols;
resize(imgOrigion, imgScale, Size(imgOrigion.cols * scaleFactor, imgOrigion.rows * scaleFactor));  // reduce image size to speed up calculation

Mat imgGray;
cvtColor(imgScale, imgGray, COLOR_BGR2GRAY);  // gray scale
Mat imgCanny;
Canny(imgGray, imgCanny, 100, 200);  // use canny operator to detect contour
imshow("Contour detection", imgCanny);

std::vector<Vec4i> lineAll;
HoughLinesP(imgCanny, lineAll, 1, CV_PI / 180, 30, 50, 4);
// draw all lines detected
Mat imgAllLines;
imgScale.copyTo(imgAllLines);
for (int i = 0, steps = lineAll.size(); i < steps; i++)
{
    line(imgAllLines, Point(lineAll[i][0], lineAll[i][1]), Point(lineAll[i][2], lineAll[i][3]), Scalar(255, 255, 255), 3, 8);
}
imshow("All lines detected", imgAllLines);

    

上图为使用Canny算子检测出的边缘。仪表板上的轮廓使得算法检测出了丰富的轮廓信息。对此轮廓图进行直线检测,结果如下图所示ÿ

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值