gpt4 book ai didi

opencv - 在对象中检测线 Opencv

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:00 25 4
gpt4 key购买 nike

我有下面的图片。我想检测将这个对象分成两部分的线。哪种方法最好?我试过 Hough 变换,但有时物体不够大,无法检测到。有什么想法吗?

谢谢!

enter image description here

最佳答案

通常,霍夫变换用于直线检测。

但如果它对您不起作用,拟合线也是一个不错的选择。

检查 OpenCV fitline 函数以获取更多详细信息和参数。

由于您已经尝试过 hough 线,我将在此处使用 OpenCV-Python 演示拟合线:

# Load image, convert to grayscale, threshold and find contours
img = cv2.imread('lail.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]

# then apply fitline() function
[vx,vy,x,y] = cv2.fitLine(cnt,cv2.cv.CV_DIST_L2,0,0.01,0.01)

# Now find two extreme points on the line to draw line
lefty = int((-x*vy/vx) + y)
righty = int(((gray.shape[1]-x)*vy/vx)+y)

#Finally draw the line
cv2.line(img,(gray.shape[1]-1,righty),(0,lefty),255,2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

下面是我得到的结果:

enter image description here

enter image description here

编辑:

如果要求把物体一分为二的线,先求拟合线,再求法线。

为此,在 cv2.fitLine() 函数下添加以下代码:

nx,ny = 1,-vx/vy
mag = np.sqrt((1+ny**2))
vx,vy = nx/mag,ny/mag

下面是我得到的结果:

enter image description here

enter image description here

希望对您有所帮助!!!

更新:

以下是您要求的第一种情况的 Python 代码的 C++ 代码。该代码对我来说很好用。输出与上面给出的相同:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv/cv.h>

using namespace std;
using namespace cv;

int main()
{
cv::Mat img, gray,thresh;
vector<vector<Point>> contours;
Vec4f lines;

img = cv::imread("line.png");
cv::cvtColor(img,gray,cv::COLOR_BGR2GRAY);
cv::threshold(gray,thresh,127,255,cv::THRESH_BINARY);
cv::findContours(thresh,contours,cv::RETR_LIST,cv::CHAIN_APPROX_SIMPLE);
cv::fitLine(Mat(contours[0]),lines,2,0,0.01,0.01);

//lefty = int((-x*vy/vx) + y)
//righty = int(((gray.shape[1]-x)*vy/vx)+y)
int lefty = (-lines[2]*lines[1]/lines[0])+lines[3];
int righty = ((gray.cols-lines[2])*lines[1]/lines[0])+lines[3];

cv::line(img,Point(gray.cols-1,righty),Point(0,lefty),Scalar(255,0,0),2);

cv::imshow("img",img);
cv::waitKey(0);
cv::destroyAllWindows();
}

关于opencv - 在对象中检测线 Opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com