2016-04-08 17 views
2

Ich versuche, auf alle Pixel zwischen 2 nicht linearen Punkten zuzugreifen. Aber ich konnte es nicht tun. Um es einfach zu sagen, mit der Funktion cvLine zeichne ich eine Linie zwischen zwei Punkten, wie in der Abbildung unten abgebildet (Ich möchte auf die Pixel entlang der grünen Linie zwischen zwei roten Punkten zugreifen).wie auf alle Pixel zwischen 2 nicht linearen Punkten auf einem Bild zugreifen

enter image description here

Ich habe versucht, die folgenden:

Rect myROI(midPx, midPy, (edgPx-midPx), (midPy-edgPy)+1);  
Mat croppedImage = mask(myROI); 

Es ist in meinem Fall nicht funktioniert.

Kann mir jemand helfen, das zu lösen?

Es tut mir leid, eigentlich habe ich das gleiche wie in Beispiel versucht, es war Fehler beim Kommentieren. Ich habe beide Methoden aus dem Beispiel ausprobiert;

LineIterator it(mask, Point(midPx, midPy), Point(edgPx, edgPy), 8); 
LineIterator it2 = it; 
vector<Vec3b> buf(it.count); 
//cout << buf<< endl; 
for(int i = 0; i < it.count; i++, ++it) 
{ 
    buf[i] = *(const Vec3b)*it; 
} 

// alternative way of iterating through the line 
//for(int i = 0; i < it2.count; i++, ++it2) 
//{ 
    // cout <<it2.pos()<<","<<val<< endl; 
    //buf.at<Vec3b>(Point(i,0)) = val; 
//} 
imshow("buf Image", buf); 

aber bei buf mit Fehlern links [i]

erreur: no match for ‘operator*’ in ‘*cv::Vec<unsigned char, 3>(((const unsigned char*)it.cv::LineIterator::operator*())) 
+0

'Es ist in meinem case.' funktioniert nicht - was nicht funktioniert, was sind die Fehler? –

+1

mit Rect ist keine gute Wahl, da es alle Pixel innerhalb des Rechtecks ​​zwischen 2 Punkten – KUMAR

Antwort

1

Check out LineIterator, die jedes Pixel einer Zeile zu erhalten verwendet wird, und ermöglicht es Ihnen, sie zu verarbeiten: http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#lineiterator

Kleine Beispiel (basierend auf den Link):

// grabs pixels along the line (pt1, pt2) 
// from 8-bit 3-channel image to the buffer 
LineIterator it(img, pt1, pt2); 
vector<Vec3b> buf(it.count); 

// iterate through the line 
for(int i = 0; i < it.count; i++, ++it) 
    buf[i] = *(const Vec3b)*it; 
+0

Dank für den Link und Beispielcode, das scheint wirklich gute Idee, aber wenn ich versuchte, ich erhalte einen Fehler bei "buf [i] = * (const Vec3b) * it; "saying " Erreur: keine Übereinstimmung für 'operator *' in '* cv :: Vec (((const unsigned char *) it.cv::LineIterator :: operator *())) " – KUMAR

+0

Ihr Code ist ein wenig anders als das Beispiel (' buf [i] = (const Vec3b) * es; 'statt' buf [i] = * (const Vec3b) * es; ') . Wenn das Problem weiterhin besteht, versuchen Sie, Ihren Code zu posten, damit Sie leichter helfen können. – Moreira

+0

In Ihrem Code haben Sie 'buf (i)' anstelle von 'buf [i]', vielleicht ist das der Grund? Versuchen Sie, Ihren ursprünglichen Beitrag mit dem Code zu bearbeiten, da Sie die 'cv :: Mat' erstellen, bis Sie den Fehler – Moreira