是否有解決方案來訪問沿着曲線/路徑的像素?我們可以使用LineIterator來做它使用opencv訪問沿着曲線/路徑的像素
7
A
回答
4
好的,這裏是一種訪問像素的方法,可以連接一個可以參數化的曲線。可能會有更高效的方法,但這個很簡單:只在參數步驟中對曲線進行採樣,以便不會訪問像素兩次,也不會跳過像素:
我已經從參數函數維基百科作爲樣品: 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
6
是的,你可以使用CvLineIterator
方法來訪問像素。
請參考下面的鏈接,
http://opencv.jp/opencv-2.2_org/c/core_drawing_functions.html
4
我不認爲有任何內置的功能這一點。您需要首先在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
同一位置。
雖然這個例子是一個簡單的使用Hough變換,你可以與任何其他曲線使用它,只要你有曲線的數據WRT原始圖像。
HTH
相關問題
- 1. 沿着曲線路徑放置圖像
- 2. 沿着曲線路徑在背景中移動的圖像android
- 3. 沿着Bezier曲線路徑的iPhone移動UI圖像視圖
- 4. 沿着XNA的曲線路徑動畫雪碧
- 5. 沿着曲線繪製動畫圖像
- 6. 正弦曲線沿着正弦曲線
- 7. SVG:沿曲線路徑追加形狀
- 8. 紙JS:波浪線,沿着路徑刷
- 9. 沿着路徑的ActionScript 2
- 10. 使用OpenCV多通道沿通道方向訪問像素Mat
- 11. 沿着明像素的擬合線
- 12. QGraphicsItem沿着路徑移動
- 13. 沿着路徑滾動Paper.js
- 14. 沿着路徑拖動snap.svg
- 15. 如何使box2d物體沿着貝塞爾曲線/圓弧路徑移動
- 16. OpenCV:沿着單像素分支搜索像素
- 17. 沿着matplotlib中的曲線的註釋
- 18. 沿着Matplotlib曲線的凹凸
- 19. 沿着路徑在PHP中彎曲文本?
- 20. 如何在paper.js中沿着貝塞爾曲線路徑製作物體動畫?
- 21. 沿着在python參數化曲線
- 22. 沿着3d曲線渲染圓形
- 23. 沿着動畫路徑的SVG:animateMotion
- 24. 沿着路徑的OpenGL管道
- 25. CA2000:沿着所有的異常路徑
- 26. OpenCV使用鼠標訪問像素值
- 27. 使用Mat OpenCV訪問像素
- 28. 沿線路徑拖動uiview
- 29. 如何繪製沿其路徑厚度變化的曲線?
- 30. SWIFT:沿着直線路徑上的每個子節點分別
的可能重複的[OpenCV的 - 訪問沿曲線/路徑像素](HTTP:/ /stackoverflow.com/questions/5078387/opencv-access-to-pixels-along-the-curve-path) –
你從哪裏得到曲線/路徑?或者你允許哪種方式?多項式?樣條曲線? – Micka