Normalerweise wird Hough-Transformation zum Linienerfassung verwendet.
Aber wenn es für Sie nicht funktioniert, ist die passende Linie auch eine gute Alternative.
Überprüfen Sie OpenCV fitline Funktion für weitere Details und Parameter.
Da Sie bereits hough Linien versucht haben, werde ich Fittinglinie hier demonstrieren, mit 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()
unten ist das Ergebnis, das ich bekam:
EDIT:
Wenn Sie die Linie finden möchten, um das Objekt in zwei Teile zu teilen, suchen Sie zuerst die passende Linie, und suchen Sie dann die Linie normal dazu.
Dafür unten Stück Code unter cv2.fitLine add() Funktion:
nx,ny = 1,-vx/vy
mag = np.sqrt((1+ny**2))
vx,vy = nx/mag,ny/mag
Und unten sind die Ergebnisse, die ich habe:
Hoffnung es hilft !!!
UPDATE:
Unten ist der C++ Code für Python-Code des ersten Falles, wie Sie verlangten. Der Code funktioniert gut für mich. Die Ausgabe ist wie oben angegeben:
#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();
}
Vielen Dank, ich werde dies heute versuchen: D Oh, ich bin ein Fan von Ihrem Blog :) –
Haben Sie eine Version für C++? : P –
Hallo, alle Funktionen sind Standardfunktionen von OpenCV. Wenn Sie die opencv-Dokumente überprüfen, können Sie entsprechende C++ - Funktionen für jede Python-Funktion finden, die ich verwendet habe. Bitte versuchen Sie es selbst, und wenn Sie irgendwelche Schwierigkeiten finden, kommentieren Sie mich. Ich werde versuchen zu helfen ... –