Czy istnieje rozwiązanie umożliwiające dostęp do pikseli wzdłuż krzywej/ścieżki? czy możemy użyć LineIterator, aby to zrobić?Dostęp do pikseli wzdłuż krzywej/ścieżki przy użyciu opencv
Odpowiedz
OK, oto sposób dostępu do pikseli wzdłuż połączonej krzywej, którą można parametryzować. Mogą być bardziej efektywne sposoby, ale ten jest dość prosty: wystarczy wypróbować krzywą w krokach parametrów, aby nie uzyskać dostępu do piksela dwa razy i nie pomijać piksela:
Zrobiłem funkcję parametryczną od wikipedia jako próbka: 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;
}
podając te wyniki:
pikseli obejrzano raz:
pikseli dostępny więcej niż jeden raz:
zacisków wyjściowych: nIterations: 1240 for activePixel: 1065
Czy możemy użyć myszy do przesunięcia krzywej za pomocą opencv? – AHF
@AHF co masz na myśli przesuwając krzywą? openCV ma pewien interfejs do korzystania z wejść myszy. Ale moje algorytmy to "dostęp" (czyli automatyczne przetwarzanie) każdego piksela trafionego przez parametryzowalną krzywą (f (t)). – Micka
jak i stan tutaj http://stackoverflow.com/questions/23641208/how-to-draw-curve-on-control-points-using-opencv Muszę narysować trzy krzywej dla RGB i przenieść ich krzywej, co wszystko działa dobrze, ale rysowanie krzywej, aby poruszać się za pomocą myszy, stwarza dla mnie problem, ponieważ nie dostałem wielu dobrych przykładów w Internecie – AHF
Tak, możesz użyć metody CvLineIterator
, aby uzyskać dostęp do pikseli.
Patrz na poniższy link,
http://opencv.jp/opencv-2.2_org/c/core_drawing_functions.html
nie sądzę istnieje funkcja wbudowana w tej sprawie. Najpierw musisz zdefiniować linię/krzywą w strukturze cv::Mat
, a następnie kontynuować. Pozwól mi wyjaśnić na przykładzie.
- Masz zdjęcie,
cv::Mat input_image
i użyćcv::HoughLinesDetector
do wykrywania linii w obrazie, które są przechowywane wcv::Mat hough_lines
. - Następnie trzeba wykonać iterację
hough_lines
i wypełnićcv::Mat hough_Mat(cv::Size(input_image.size()))
(który powinien zostać przekształcony w BGR obrazu, jeśli chcesz pokazać swoje linie jasno przeciwko oryginalnych danych. - Następnie, po prostu iterację
hough_Mat
dla których piksele są powyżej zero, a potem po prostu dostęp do tej samej lokalizacji winput_image
.
Chociaż ten przykład jest prosta przy użyciu Hough Transform, można go używać w żadnej innej krzywej, tak długo, jak masz dane krzywa jest wrt oryginalny obraz.
HTH
- 1. OpenCV: Wyszukiwanie pikseli wzdłuż gałęzi jednopikselowych
- 2. OpenCV - kurczyć obiektów pikseli
- 3. Usuwanie hałaśliwych pikseli za pomocą opencv
- 4. Niebezpieczny dostęp na piksel, dostęp do 30ms dla 1756000 pikseli
- 5. Rysowanie kuli przy użyciu pikseli 3D (wokseli)
- 6. Uzyskiwanie dostępu do wartości pikseli OpenCV 2.3 - C++
- 7. OpenCV 2.3: Konwertuj macie do macierzy pikseli RGBA
- 8. Dostęp do DOM przy użyciu WebBrowser
- 9. dostęp do elementu html przy użyciu xpath
- 10. Jak uzyskać dostęp do koloru pikseli w bitmapie?
- 11. OpenCV C++: jak uzyskać dostęp do wartości pikseli CV_32F przez wskaźnik danych ucharowych
- 12. Opencv - Współrzędne pikseli z dopasowywania elementów
- 13. Równoległe przetwarzanie GPU przy użyciu OpenCV
- 14. Błąd przy użyciu knnMatch z OpenCV + Python
- 15. Otwórz kamerę macierzystą Android przy użyciu OpenCV
- 16. Kadrowanie obrazu w Androidzie przy użyciu opencv
- 17. otwieranie i zamykanie przy użyciu OpenCV
- 18. OpenCV przy użyciu k-środków do posteryzacji obrazu
- 19. Dostęp do macierzy opencv Element CV_32S
- 20. Dostęp Ostatnia zmienna statyczna przy użyciu odbicia
- 21. Dostęp Object3D załadowany przy użyciu OBJMTLLoader
- 22. OpenCV elementem dostęp z Mat
- 23. uzyskiwanie dostępu do wartości pikseli obrazu w skali szarości w OpenCV
- 24. Dostęp do HtmlHelpers z WebForm przy użyciu ASP.NET MVC
- 25. Dostęp do wiadomości e-mail przy użyciu imap
- 26. Jak uzyskać dostęp do opcji Drawable przy użyciu Picassa?
- 27. dostęp do pliku przy użyciu Javy z Sambą JCIFS
- 28. Dostęp do bazy danych sql przy użyciu C# na jedności?
- 29. Dostęp do usługi SkyDrive przy użyciu PHP i OAuth
- 30. Dostęp do sieci Web przy użyciu Powershell i Proxy
możliwe duplikat [OpenCV - dostęp do pikseli wzdłuż krzywej/ścieżka] (http://stackoverflow.com/questions/5078387/opencv-access-to-pixels-along- the-curve-path) –
skąd otrzymujesz krzywą/ścieżkę? Albo na jakie patenty pozwalasz? Wielomiany? Splines? – Micka