как получить доступ ко всем пикселям между двумя нелинейными точками на изображении

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

введите здесь описание изображения

Я пробовал следующее:

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[i]

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

person KUMAR    schedule 08.04.2016    source источник
comment
It doesn't work in my case. - что не работает, какие ошибки?   -  person Aleksander Lidtke    schedule 08.04.2016
comment
использование Rect не является хорошим выбором, так как он учитывает все пиксели внутри прямоугольника между двумя точками.   -  person KUMAR    schedule 08.04.2016


Ответы (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;
person Moreira    schedule 08.04.2016
comment
спасибо за ссылку и пример кода, это кажется действительно хорошей идеей, но когда я попытался, я получил сообщение об ошибке в buf[i] = (const Vec3b)*it; говоря erreur: нет совпадения для 'operator' в 'cv::Vec‹unsigned char, 3›(((const unsigned char)it.cv::LineIterator::operator*( ))) - person KUMAR; 08.04.2016
comment
Ваш код немного отличается от примера ( buf[i] = (const Vec3b)*it; вместо buf[i] = *(const Vec3b)*it; ). Если проблема не устранена, попробуйте опубликовать свой код, чтобы вам было легче помочь. - person Moreira; 08.04.2016
comment
В вашем коде у вас buf(i) вместо buf[i], может в этом причина? Попробуйте отредактировать свой исходный пост с кодом, так как вы создаете cv::Mat, пока не получите ошибку - person Moreira; 08.04.2016
comment
Извините, на самом деле я попробовал то же самое, что и в примере, это была ошибка при комментировании. Я попробовал оба метода из примера; for(int i = 0; i < it.count; i++, ++it) { buf(i) = *(const Vec3b)*it; } > // for(int i = 0; i < it2.count; i++, ++it2) { // Vec3b val = mask.at<Vec3b>(it2.pos()); // cout <<it2.pos()<<","<<val<< endl; // CV_Assert(buf[i] == val); } imshow("buf Image", buf); но та же ошибка erreur: no match for ‘operator’ in ‘cv::Vec<unsigned char, 3>(((const unsigned char)it.cv::LineIterator::operator*())) - person KUMAR; 08.04.2016
comment
Хорошо, попробуйте изменить цикл for на это: for(int i=0; i<it.count; i++) { buf.push_back( Vec3b(*it) ); it++; } - person Moreira; 08.04.2016
comment
эй, спасибо за эту помощь, на самом деле это работает хорошо, но единственная проблема в том, что общее количество пикселей увеличилось в 2 раза, т.е. первая половина строки пикселей - это черные пиксели (лишние и нежелательные), а требуемые пиксели начинаются со второй половины до конца. Но для меня это не проблема, так как я могу считать со второй половины. В любом случае еще раз спасибо - person KUMAR; 11.04.2016