2016-04-08 2 views
2

Я пытаюсь получить доступ ко всем пикселям между двумя нелинеальными точками. Но я не мог этого сделать. Чтобы сказать, что это просто, с функцией cvLine я рисую линию между двумя точками, как показано на изображении ниже (я хочу получить доступ к пикселям вдоль зеленой линии между двумя красными точками).Как получить доступ ко всем пикселям между двумя нелинейными точками на изображении

enter image description here

Я попытался следующие:

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

Это не работает в моем случае.

Может ли кто-нибудь помочь мне решить эту проблему?

Извините, на самом деле я пробовал то же, что и в примере, это была ошибка при комментировании. Я попробовал оба метода из примера;

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); 

но оставил с ошибкой в ​​BUF ​​[я]

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

'Это не работает в моем случае.' - что не работает, каковы ошибки? –

+1

с использованием Rect не является хорошим выбором, поскольку он рассматривает все пиксели внутри прямоугольника между двумя точками – KUMAR

ответ

1

Заканчивать LineIterator, который используется для получения каждого пикселя строки и позволяет обрабатывать их: http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#lineiterator

Малый пример (по ссылке):

// 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

спасибо за ссылку и образец кода, это кажется действительно хорошей идеей, но когда я попытался получить ошибку на "buf [i] = * (const Vec3b) * it; "говорит " erreur: нет соответствия для 'operator *' in '* cv :: Vec (((const unsigned char *) it.cv::LineIterator :: оператор *())) « – KUMAR

+0

Ваш код немного отличается от вашего примера (' buf [i] = (const Vec3b) * it; 'вместо' buf [i] = * (const Vec3b) * it; ') , Если проблема остается, попробуйте опубликовать свой код, чтобы вам было легче помочь. – Moreira

+0

В вашем коде есть 'buf (i)' вместо 'buf [i]', может быть, это и есть причина? Попробуйте изменить исходный пост с кодом, так как вы создаете 'cv :: Mat', пока не получите ошибку – Moreira