有谁知道如何使用霍夫变换来检测二进制图像中最强的线:
A = zeros(7,7);
A([6 10 18 24 36 38 41]) = 1;
Run Code Online (Sandbox Code Playgroud)
使用(rho; theta)格式,θ为-45°至90°的45°.如何在MATLAB中显示累加器数组.
有任何帮助或提示吗?
谢谢!
我一直试图在广场周围找到4条线,以便我可以获得正方形的顶点.由于准确性,我采用这种方法而不是直接使用Harris或轮廓方法找到角点.在opencv中使用内置函数中的houghlines,我无法获得全长行来获得交叉点,而且我也得到了太多不相关的行.我想知道参数是否可以微调以获得我的要求?如果是,我该如何解决?我的问题与此处的问题完全相同.但是,即使在更改这些参数后,我也无法获得这些线条.我已将原始图像与代码和输出相关联:
原始图片:
码:
#include <Windows.h>
#include "opencv2\highgui.hpp"
#include "opencv2\imgproc.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/videoio/videoio.hpp"
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
Mat image,src;
image = imread("c:/pics/output2_1.bmp");
src = image.clone();
cvtColor(image, image, CV_BGR2GRAY);
threshold(image, image, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY_INV);
namedWindow("thresh", WINDOW_NORMAL);
resizeWindow("thresh", 600, 400);
imshow("thresh", image);
cv::Mat edges;
cv::Canny(image, edges, 0, 255);
vector<Vec2f> lines;
HoughLines(edges, lines, 1, CV_PI / 180, 100, 0, 0);
for (size_t i = 0; i < lines.size(); …Run Code Online (Sandbox Code Playgroud) 我试图通过OpenCV检测反映环境的银球:
有了黑球,我通过检测圆圈成功地做到了:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(5,5),0);
gray = cv2.medianBlur(gray,5)
gray = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,3.5)
kernel = np.ones((3,3),np.uint8)
gray = cv2.erode(gray,kernel,iterations = 1)
gray = cv2.dilate(gray,kernel,iterations = 1)
circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 1, 260, \
param1=30, param2=65, minRadius=0, maxRadius=0)
Run Code Online (Sandbox Code Playgroud)
但是当使用带银球的程序时,我们没有得到任何结果.
当观察程序计算的边缘时,球的边缘非常清晰.但是守则并没有承认任何球.

如何提高银球的检测率?我想到了两种方法: - 改善边缘计算 - 使圆检测接受边缘不清晰的图像这可能吗?这样做的最佳方法是什么?
非常感谢帮助.

在此图像中,我需要检测车辆轮辋并通过图像处理测量轮辋的像素长度.我想我应该遵循循环Hough变换的圆圈.你能告诉我哪些步骤可以获得轮辋的宽度?ex(灰度 - >边缘检测,或对此的任何其他评论)
image-processing edge-detection grayscale hough-transform threshold
我正在阅读Learning openCV,我cvHoughLines2在本书中遇到了描述.但我无法理解一件事.
我读到Hough变换,我想我的理解,这样的参数rho,并theta会按位令人费解给我.当我们rho=xcos(theta)+ycos(theta)在确定某些离散值时theta,我们有等式,rho应该自动知道值.
在本书中,据说opencv创建了rhox thetaaccumlator数组.
opencv是否只是将角度离散为倍数360/theta?但rho参数如何适合?rho离散化的价值如何?
在Matlab中,通过组合霍夫变换,houghpeaks和houghlines,可以在原始图像中显示检测到的线条.
这可以在下面的图像中显示(通过使用来自Matlab的houghlines帮助的示例代码生成).检测到绿线.蓝色的是最长的一个:

我在我生成的简单合成图像上运行了cv :: HoughLines(几个正方形等).图像附在此处:

相关代码部分是:
cv::vector<cv::Vec2f> lines;
cv::HoughLines(I_BW, lines, 1, CV_PI/180,200);
cv::Mat linesMat ( lines, true );
Run Code Online (Sandbox Code Playgroud)
查看linesMat矩阵(我将其转换为此形式以便我可以使用图像监视来查看数据),同时运行for循环以在边缘图像上添加红线我看到rho和theta按最长的顺序排序图像中的线条.
我的输出是:

线条是图像的整个宽度(或高度).如何在Matlab示例中显示实际的行?我可以从rho + theta回到x和y,然后我必须以某种方式将它们链接到检测到的边缘等等 - 也许有一种简单的方法可以做到这一点,我错过了?
谢谢!
我正在开发一个小型OpenCV项目,用于从手机摄像头中检测某种颜色的线条.
总之希望:
这些是我想要使用的功能,但不能确定如何填补缺失的位.
这是在处理来自CvVideoCamera实例的图像时从智能手机应用程序调用的processImage函数
- (void)processImage:(Mat&)image;
{
cv::Mat orig_image = image.clone();
cv::Mat red_image = ??
// Apply houghes transformation to detect lines between a minimum length and a maximum length (I was thinking of using the CV_HOUGH_PROBABILISTIC method..)
// Comment.. see below..
Run Code Online (Sandbox Code Playgroud)
vector<Vec2f> lines;
Run Code Online (Sandbox Code Playgroud)
从官方文档:
C++:void HoughLines(InputArray image,OutputArray lines,double rho,double theta,int threshold,double srn = 0,double stn = 0)
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 ); …Run Code Online (Sandbox Code Playgroud) c++ opencv feature-extraction hough-transform color-detection
我试图理解MATLAB的Hough变换代码.
在这张照片中我清楚了一些项目,
binary_image是单色版input_image.hough_lines是包含图像中检测到的线条的矢量.我看到,已检测到四条线.T包含(?, ?)图像空间中的thetas .R包含(?, ?)图像空间中的rhos .我有以下问题,
H代表什么?H(霍夫矩阵)大小为45x180?这个尺寸来自哪里?T尺寸为1x180?这个尺寸来自哪里?R尺寸为1x45?这个尺寸来自哪里?P代表什么?他们(x, y)还是(?, ?) ?
Run Code Online (Sandbox Code Playgroud)29 162 29 165 28 170 21 5 29 158
houghpeaks()?ceil(0.3*max(H(:)))什么?相关的源代码
% Read image into workspace.
input_image = imread('Untitled.bmp');
%Rotate the image.
rotated_image = imrotate(input_image,33,'crop');
% convert rgb to grascale
rotated_image …Run Code Online (Sandbox Code Playgroud) matlab image image-processing computer-vision hough-transform
我正在使用 python 和 OpenCV。我试图找到电池的中心和角度:
比我有的代码是这样的:
import cv2
import numpy as np
img = cv2.imread('image/baterias2.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = cv2.imread('image/baterias4.png',0)
minLineLength = 300
maxLineGap = 5
edges = cv2.Canny(img2,50,200)
cv2.imshow('Canny',edges)
lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap)
print lines
salida = np.zeros((img.shape[0],img.shape[1]))
for x in range(0, len(lines)):
for x1,y1,x2,y2 in lines[x]:
cv2.line(salida,(x1,y1),(x2,y2),(125,125,125),0)# rgb
cv2.imshow('final',salida)
cv2.imwrite('result/hough.jpg',img)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
有什么想法可以解决吗?
我正在尝试使用opencv 4 android sdk检测矩形文档。首先我试图通过找到轮廓来检测它,但是它不能用于多彩色文档。您可以检查此链接以获得更好的主意: 使用OpenCV4Android检测多彩色文档
我进行了很多研究,发现可以使用houghline变换来完成它,因此我遵循以下方法来检测文档:
原始图像-> cvtColor->高斯模糊滤波器->对其进行扩张以锐化边缘->应用分水岭图像分割算法->具有动态otsu阈值的canny边缘检测->然后应用霍夫线变换
我为霍夫线变换所做的是:
Imgproc.HoughLinesP(watershedMat, lines, 1, Math.PI / 180, 50, 100, 50);
List<Line> horizontals = new ArrayList<>();
List<Line> verticals = new ArrayList<>();
for (int x = 0; x < lines.rows(); x++)
{
double[] vec = lines.get(x, 0);
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
Line line = new Line(start, end);
if (Math.abs(x1 - x2) > Math.abs(y1-y2)) …Run Code Online (Sandbox Code Playgroud) opencv edge-detection hough-transform opencv4android houghlinesp
hough-transform ×10
opencv ×7
matlab ×3
c++ ×2
python ×2
grayscale ×1
houghlinesp ×1
image ×1
threshold ×1