如果我不执行任何操作(即不通过控制窗口更改颜色检测 HSV),则应用程序运行正常。但是,如果我在应用程序运行时更改 HSV 值,则会收到以下错误。我已经在没有霍夫的情况下测试了代码,它运行良好。
CPU 错误 -
HoughFinder.exe 中 0x00007FF9ECA64388 (ucrtbase.dll) 处出现未处理的异常:将无效参数传递给认为无效参数致命的函数。
这是我的代码 -
VideoCapture capture(0); // 0 is my webcam
...
capture.read(displayOriginal))
...(Code to detect colors for extra accuracy)
cudaCanny->detect(imgThresholded, imgCanny);
vector<Vec2f> lines;
//Ptr<HoughLinesDetector> hough = createHoughLinesDetector(1, CV_PI / 180, 100); CUDA code...
//hough->detect(imgCanny, lines); CUDA code...
HoughLines(displayCanny, lines, 1, CV_PI / 180, 100, 0, 0); // CPU code...
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2; …Run Code Online (Sandbox Code Playgroud) 我正在用 OpenCV 编写一个用于月球陨石坑检测的 C++ 程序,它似乎只能准确地检测到一小部分陨石坑。我对这种方法的策略是首先将图像转换为 HSV,然后用于inRange()捕捉一系列值中的颜色以产生阈值,然后对其进行高斯模糊并用于HoughCircles()检测圆圈。
我不完全理解的一件事是,当我inRange()在颜色周围设置低阈值和高阈值时,它根本不会返回任何内容。只是一个黑色的图像。它仅在我将低阈值设置为时才有效,Scalar(0,0,0)但我认为这会使其有些不准确。有什么我不明白的吗?我的测试图像如下。
这是我用来测试此图像的代码:
#include <cstdio>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
// using namespace cv;
printf("%s\n", argv[1]);
Mat src=imread(argv[1]);
if (!src.data) {
std::cout << "ERROR:\topening image" <<std::endl;
return -1;
}
// converts the image to hsv so that circle detection is more accurate
Mat hsv_image;
cvtColor(src, hsv_image, COLOR_BGR2HSV);
// high …Run Code Online (Sandbox Code Playgroud) 我试图用 Houghlines 变换找到这两条水平线。正如你所看到的,图像非常嘈杂!目前我的工作流程如下所示:
裁剪图像
模糊它
降低噪声(为此,我反转图像,然后将模糊图像减去反转图像)
打开它并使用“水平内核”对其进行扩展(kernel_1 = np.ones((10,1), np.uint8)
临界点
胡格林斯
结果不如预期...是否有更好的策略,知道我将始终搜索水平线(因此,abs(theta)将始终接近 0 或 pi)
我想找一个圆形物体(眼睛的虹膜,我使用Haar Cascase和中提琴琼斯算法).所以我发现霍夫圈是正确的方法.任何人都可以解释我如何在Java中实现霍夫圈或任何其他简单的实现来用Java找到虹膜.
谢谢,
所以我试图在C上编码Hough变换.我有一个二进制图像并从图像中提取了二进制值.现在做霍夫变换我必须将图像中的[X,Y]值转换为[rho,theta]来进行形式的参数变换
RHO = xcos(THETA)+ ysin(THETA)
我不太明白它是如何实际转换的,看看其他在线代码.任何帮助解释算法以及如何根据[X,Y]完成[rho,theta]值的累加器将不胜感激.谢谢.提前.:)
我正在使用opencv和Eclipse进行图像处理.
vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );
for( size_t i = 0; i < lines.size(); i++ )
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
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( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个代码如何定义点.我们正在使用
y=(-cos(theta)/sin(theta))x + r/(sin(theta))
rho=xo*cos(theta) + …Run Code Online (Sandbox Code Playgroud) 我试图检测眼睛的虹膜,但HoughCircles返回0圈。
输入图像(眼睛)为:
然后,使用此图像进行以下操作:
cvtColor(eyes, gray, CV_BGR2GRAY);
morphologyEx(gray, gray, 4,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3,3)));
threshold(gray, gray, 0, 255, THRESH_OTSU);
vector<Vec3f> circles;
HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 2, gray.rows/4);
if (circles.size())
cout << "found" << endl;
Run Code Online (Sandbox Code Playgroud)
因此,最终的灰色图像如下所示:
我已经发现了使用HoughCircles来检测和测量瞳孔和虹膜的问题,但尽管与我的问题相似,但它并没有帮助我。
那么为什么HoughCircles在尝试检测虹膜时返回0圈呢?如果有人知道找到虹膜的更好方法,欢迎您。
我有一个关于HoughLines的opencv库的问题.格式如下:官方网站:
C++:void HoughLines(InputArray image,OutputArray lines,double rho,double theta,int threshold,double srn = 0,double stn = 0)
并且对行的输出数组参数进行了解释,它说:
lines - 行的输出向量.每条线由两元素矢量表示:rho和theta.对于垂直线,theta为0,对于水平线,则θ为2(辐射亮度).
我想知道theta的原理是什么?似乎theta是在0〜1.57的范围内(因为PI/2为1.57),但我运行代码并找出THETA可以超过1.57,并成为一些奇怪的值,如下面的图中,红线是检测到的by HoughLines,sita是参数行中的值?
.
任何人都可以告诉我从线输出的theta的规律性是什么?
非常感谢 !
我是新手在两个python和opencv,我在检测以下图像,其具有放置在地面黑线带中的行面临的一个问题:
我使用了以下代码:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
print img.shape[1]
print img.shape
minLineLength = img.shape[1]-1
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
Run Code Online (Sandbox Code Playgroud)
但是它无法准确地检测到线条,只能在底部的第一个黑色条带上绘制一条绿线,甚至不覆盖整条线条,
另外,
请建议一种获取y每条线路的坐标的方法.
我试图用hough变换hough(edge_detected_image).然后我使用以下命令:
imshow(h,[],'XData',theta,'YData',rho,'InitialMagnification','fit');
axis on
axis normal
hold on
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?有任何设置要做吗?