Есть ли решение для доступа к пикселям вдоль кривой/пути? мы можем использовать LineIterator для этогоДоступ к пикселям вдоль кривой/пути с использованием opencv
ответ
Хорошо, вот способ доступа к пикселю вдоль связанной кривой, которая может быть параметризована. Там могут быть более эффективные способы, но это достаточно просто: просто проведите кривую в параметрах, чтобы вы не дважды обращались к пикселю и не пропускали пиксель:
Я взял параметрическую функцию из википедия в качестве образца: http://en.wikipedia.org/wiki/Parametric_equation#Some_sophisticated_functions
int main()
{
cv::Mat blank = cv::Mat::zeros(512,512,CV_8U);
// parametric function:
// http://en.wikipedia.org/wiki/Parametric_equation#Some_sophisticated_functions
// k = a/b
// x = (a-b)*cos(t) + b*cos(t((a/b)-1))
// y = (a-b)*sin(t) - b*sin(t((a/b)-1))
float k = 0.5f;
float a = 70.0f;
float b = a/k;
// translate the curve somewhere
float centerX = 256;
float centerY = 256;
// you will check whether the pixel position has moved since the last active pixel, so you have to remember the last one:
int oldpX,oldpY;
// compute the parametric function's value for param t = 0
oldpX = (a-b)*cos(0) + b*cos(0*((a/b)-1.0f)) + centerX -1;
oldpY = (a-b)*sin(0) - b*sin(0*((a/b)-1.0f)) + centerY -1;
// initial stepsize to parametrize the curve
float stepsize = 0.01f;
//counting variables for analyzation
unsigned int nIterations = 0;
unsigned int activePixel = 0;
// iterate over whole parameter region
for(float t = 0; t<4*3.14159265359f; t+= stepsize)
{
nIterations++;
// compute the pixel position for that parameter
int pX = (a-b)*cos(t) + b*cos(t*((a/b)-1.0f)) + centerX;
int pY = (a-b)*sin(t) - b*sin(t*((a/b)-1.0f)) + centerY;
// only access pixel if we moved to a new pixel:
if((pX != oldpX)||(pY != oldpY))
{
// if distance to old pixel is too big: stepsize was too big
if((abs(oldpX-pX)<=1) && (abs(oldpY-pY)<=1))
{
//---------------------------------------------------------------
// here you can access the pixel, it will be accessed only once for that curve position!
blank.at<unsigned char>((pY),(pX)) = blank.at<unsigned char>((pY),(pX))+1;
//---------------------------------------------------------------
// update last position
oldpX = pX;
oldpY = pY;
activePixel++; // count number of pixel on the contour
}
else
{
// adjust/decrease stepsize here
t -= stepsize;
stepsize /= 2.0f;
//TODO: choose smarter stepsize updates
}
}
else
{
// you could adjust/increase the stepsize here
stepsize += stepsize/2.0f;
//TODO: prevent stepsize from becoming 0.0f !!
//TODO: choose smarter stepsize updates
}
}
std::cout << "nIterations: " << nIterations << " for activePixel: " << activePixel << std::endl;
cv::imwrite("accessedOnce.png", blank>0);
cv::imwrite("accessedMulti.png", blank>1);
cv::waitKey(-1);
return 0;
}
дает следующие результаты:
пикселей доступ один раз:
пикселей доступ более чем один раз:
терминал выход: nIterations: 1240 for activePixel: 1065
Можно ли использовать мышь для перемещения кривой с помощью opencv? – AHF
@AHF Что вы подразумеваете под движением кривой? openCV имеет некоторый интерфейс для использования входов мыши. Но мои алгоритмы предназначены для «доступа» (что означает автоматическую обработку) каждого пикселя, который попадает под параметризуемую (f (t)) кривую. – Micka
как я заявляю здесь http://stackoverflow.com/questions/23641208/how-to-draw-curve-on-control-points-using-opencv Мне нужно нарисовать три кривые для RGB и переместить их кривую, все работает отлично, но рисование кривой для перемещения с помощью мыши создает проблему для меня, поскольку у меня не было много хороших примеров в Интернете. – AHF
Да, вы можете использовать метод CvLineIterator
для доступа к пикселям.
Пожалуйста, обратитесь к следующей ссылке,
http://opencv.jp/opencv-2.2_org/c/core_drawing_functions.html
Я не думаю, что есть какие-либо встроенные функции для этого. Сначала вам нужно определить линию/кривую в структуре cv::Mat
, а затем перейти оттуда. Позвольте мне объяснить пример.
- У вас есть изображение,
cv::Mat input_image
и вы используетеcv::HoughLinesDetector
для обнаружения линий в изображении, которые хранятся вcv::Mat hough_lines
. - Затем вам нужно будет перебирать
hough_lines
и заполнитьcv::Mat hough_Mat(cv::Size(input_image.size()))
(который должен быть преобразован в BGR изображение, если вы хотите, чтобы показать свои линии ярко против исходных данных. - Затем просто перебирать
hough_Mat
, для которых пикселей выше ноль, а затем просто получить доступ к той же месте вinput_image
.
Хотя этот пример является простым с помощью преобразования Хока, вы можете использовать его с любой другой кривой, до тех пор, пока у вас есть данные кривой в WRT исходное изображение.
HTH
- 1. Доступ к пикселю вдоль направления каналов с многоканальным OpenCV Mat
- 2. Как получить доступ к пикселям изображения с помощью opencv-python?
- 3. Доступ к пикселям изображения
- 4. Доступ к IP-камерам с использованием OpenCV
- 5. Доступ к мобильной стереокамере с использованием OpenCV
- 6. OpenCV - не удается получить доступ ко всем пикселям в мате
- 7. Эффективный доступ к пикселям изображения в Java
- 8. Доступ к аппаратным пикселям на мобильных устройствах
- 9. Доступ к пикселям в 16-битном TIFF
- 10. Обрезка изображения по выбранным пикселям в opencv
- 11. Доступ к пикселям [] массив в p5.js (javascript)
- 12. Формирование пикселя изображения по пикселям в OpenCV
- 13. Доступ к значениям изображений с использованием Мата координат (OpenCV/C++)
- 14. , чтобы упростить доступ к пикселям изображения в R
- 15. Как получить доступ к пикселям растрового изображения на Android?
- 16. Как получить доступ к пикселям PGraphics в p5.js
- 17. NSBitmapImageRep для iPhone (или прямой доступ к пикселям для CGImage)?
- 18. Доступ к пикселям 24-битного растрового изображения без использования GetPixel()?
- 19. есть ли способ доступа к пикселям видео?
- 20. Интеграция с привязкой к пикселям Win2D
- 21. Разница в доступе к пикселям по данным и по данным OpenCV
- 22. Доступ к подматрице OpenCV: копия или ссылка?
- 23. OpenCV найти все значительные ребра вдоль строки
- 24. Доступ к документации OpenCV в spyder
- 25. OpenCV: поиск пикселей вдоль однопиксельных ветвей
- 26. Проблема с преобразованием типа мата и доступом к отдельным пикселям
- 27. opencv - доступ к изображению с cv :: Point как аргумент
- 28. OpenCV: доступ к квадратным корням пикселей
- 29. OpenCV - Доступ к переменным cv2.findContours
- 30. Доступ к веб-камере из pyside/opencv
возможно дубликат [OpenCV - Доступ к пикселов вдоль кривой/путь] (HTTP://stackoverflow.com/questions/5078387/opencv-access-to-pixels-along-the-curve-path) –
где вы получаете кривую/путь? Или какие пути вы разрешаете? Многочлены? Сплайны? – Micka