删除OpenCV HoughLines检测到的小线条

删除OpenCV HoughLines检测到的小线条,opencv,hough-transform,canny-operator,Opencv,Hough Transform,Canny Operator,我试图从嘈杂的图像中检测线条,结果我得到了太多的线条。我需要多次遍历行,这太慢了,因为行太多,我只对足够长的行感兴趣 我检测行的代码如下所示: // Edge detection int lowThreshold = 35; Canny(greyMat, dst, lowThreshold, lowThreshold * 3, 3); cv::blur(dst, dst, cv::Size(2,2)); // Standard Hough Line Transform std::vector&l

我试图从嘈杂的图像中检测线条,结果我得到了太多的线条。我需要多次遍历行,这太慢了,因为行太多,我只对足够长的行感兴趣

我检测行的代码如下所示:

// Edge detection
int lowThreshold = 35;
Canny(greyMat, dst, lowThreshold, lowThreshold * 3, 3);
cv::blur(dst, dst, cv::Size(2,2));
// Standard Hough Line Transform
std::vector<cv::Vec2f> lines; // will hold the results of the detection
HoughLines(dst, lines, 1, rho_resolution, 150, 0, 0 ); // runs the actual detection
//边缘检测
int低阈值=35;
Canny(greyMat,dst,低阈值,低阈值*3,3);
cv::模糊(dst,dst,cv::大小(2,2));
//标准Hough线变换
std::矢量线;//将保留检测结果
HoughLines(dst,lines,1,rho_分辨率,150,0,0);//运行实际检测
我的源图像是

从Canny得到的图像是


粗线将检测100条线,我只对中间长的矩形形成兴趣。我怎样才能去掉短线?如果我增加Canny阈值,我需要的一些线条将不会被检测到。

常规方法是模糊图像,这样做是为了确保图像中的噪声被抑制,只留下待检测对象的实际边缘


使用的方法类型取决于图像。在提取边缘之前,您可以使用中值或/和高斯滤波器,并检查是否有任何改进。

模糊图像以减少噪声或帧中的小细节,这对我很有用

kernel = np.ones((5, 5), np.float32) / 25    
smoothed = cv2.filter2D(frame, -1, kernel)

gray=cv2.cvtColor(smoothed, cv2.COLOR_BGR2GRAY)

edge=cv2.Canny(gray, 100, 150)

lines = cv2.HoughLines(edge, 1, np.pi / 180, 200)
print(lines)

您可以使用
HoughLinesP
。第六个参数是要检测的最小线长度如果您想要得到红色矩形,您可以尝试
findContours
boundingRect/minareact
@消音器,这正是我想要的,但当我尝试检测电视屏幕时,有时边缘会因为颜色溢出而变得模糊。第一次尝试用findContours直接检测矩形,但这不起作用,现在尝试从线条中提取矩形。@superg您应该做一些预处理,例如
GaussBlur
morphologyEx
,以减少噪音。而且你没有发布你的原始图像,操作系统,很难决定使用哪种方法。@消音器实际上第一个是“原始”图像。它是从捕获的视频中累积的差异数据。电视屏幕上的任何运动最终都会使像素变红。OpenCV腐蚀功能可以在Canny之前去除细线,可以尝试一下。