2013-01-06 6 views
8

Ich habe das Bild unten. Ich möchte die Linie erkennen, die dieses Objekt in zwei Teile teilt. Was ist der beste Weg? Ich habe es mit der Hough-Transformation versucht, aber manchmal ist das Objekt nicht groß genug, um es zu erkennen. Irgendwelche Ideas?Detects Linien Opencv in Objekt

Danke!

enter image description here

Antwort

24

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:

enter image description here

enter image description here

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:

enter image description here

enter image description here

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(); 
} 
+1

Vielen Dank, ich werde dies heute versuchen: D Oh, ich bin ein Fan von Ihrem Blog :) –

+0

Haben Sie eine Version für C++? : P –

+1

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 ... –