Note that there are some explanatory texts on larger screens.

plurals
  1. POOpenCV 2.4.2 calcOpticalFlowPyrLK doesn't find any points
    text
    copied!<p>I am using OpenCV 2.4.2 on Linux. I am writing in C++. I want to track simple objects (e.g. black rectangle on the white background). Firstly I am using goodFeaturesToTrack and then calcOpticalFlowPyrLK to find those points on another image. The problem is that calcOpticalFlowPyrLK doesn't find those points.</p> <p>I have found code that does it in C, which does not work in my case: <a href="http://dasl.mem.drexel.edu/~noahKuntz/openCVTut9.html" rel="nofollow">http://dasl.mem.drexel.edu/~noahKuntz/openCVTut9.html</a></p> <p>I have converted it into C++:</p> <pre><code>int main(int, char**) { Mat imgAgray = imread("ImageA.png", CV_LOAD_IMAGE_GRAYSCALE); Mat imgBgray = imread("ImageB.png", CV_LOAD_IMAGE_GRAYSCALE); Mat imgC = imread("ImageC.png", CV_LOAD_IMAGE_UNCHANGED); vector&lt;Point2f&gt; cornersA; goodFeaturesToTrack(imgAgray, cornersA, 30, 0.01, 30); for (unsigned int i = 0; i &lt; cornersA.size(); i++) { drawPixel(cornersA[i], &amp;imgC, 2, blue); } // I have no idea what does it do // cornerSubPix(imgAgray, cornersA, Size(15, 15), Size(-1, -1), // TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 20, 0.03)); vector&lt;Point2f&gt; cornersB; vector&lt;uchar&gt; status; vector&lt;float&gt; error; // winsize has to be 11 or 13, otherwise nothing is found int winsize = 11; int maxlvl = 5; calcOpticalFlowPyrLK(imgAgray, imgBgray, cornersA, cornersB, status, error, Size(winsize, winsize), maxlvl); for (unsigned int i = 0; i &lt; cornersB.size(); i++) { if (status[i] == 0 || error[i] &gt; 0) { drawPixel(cornersB[i], &amp;imgC, 2, red); continue; } drawPixel(cornersB[i], &amp;imgC, 2, green); line(imgC, cornersA[i], cornersB[i], Scalar(255, 0, 0)); } namedWindow("window", 1); moveWindow("window", 50, 50); imshow("window", imgC); cvWaitKey(0); return 0; } </code></pre> <blockquote> <p>ImageA: <a href="http://oi50.tinypic.com/14kv05v.jpg" rel="nofollow">http://oi50.tinypic.com/14kv05v.jpg</a></p> <p>ImageB: <a href="http://oi46.tinypic.com/4l3xom.jpg" rel="nofollow">http://oi46.tinypic.com/4l3xom.jpg</a></p> <p>ImageC: <a href="http://oi47.tinypic.com/35n3uox.jpg" rel="nofollow">http://oi47.tinypic.com/35n3uox.jpg</a></p> </blockquote> <p>I have found out that it works only for winsize = 11. I have tried using it on a moving rectangle to check how far it is from the origin. It hardly ever detects all four corners.</p> <pre><code>int main(int, char**) { std::cout &lt;&lt; "Compiled at " &lt;&lt; __TIME__ &lt;&lt; std::endl; Scalar white = Scalar(255, 255, 255); Scalar black = Scalar(0, 0, 0); Scalar red = Scalar(0, 0, 255); Rect rect = Rect(50, 100, 100, 150); Mat org = Mat(Size(640, 480), CV_8UC1, white); rectangle(org, rect, black, -1, 0, 0); vector&lt;Point2f&gt; features; goodFeaturesToTrack(org, features, 30, 0.01, 30); std::cout &lt;&lt; "POINTS FOUND:" &lt;&lt; std::endl; for (unsigned int i = 0; i &lt; features.size(); i++) { std::cout &lt;&lt; "Point found: " &lt;&lt; features[i].x; std::cout &lt;&lt; " " &lt;&lt; features[i].y &lt;&lt; std::endl; } bool goRight = 1; while (1) { if (goRight) { rect.x += 30; rect.y += 30; if (rect.x &gt;= 250) { goRight = 0; } } else { rect.x -= 30; rect.y -= 30; if (rect.x &lt;= 50) { goRight = 1; } } Mat frame = Mat(Size(640, 480), CV_8UC1, white); rectangle(frame, rect, black, -1, 0, 0); vector&lt;Point2f&gt; found; vector&lt;uchar&gt; status; vector&lt;float&gt; error; calcOpticalFlowPyrLK(org, frame, features, found, status, error, Size(11, 11), 5); Mat display; cvtColor(frame, display, CV_GRAY2BGR); for (unsigned int i = 0; i &lt; found.size(); i++) { if (status[i] == 0 || error[i] &gt; 0) { continue; } else { line(display, features[i], found[i], red); } } namedWindow("window", 1); moveWindow("window", 50, 50); imshow("window", display); if (cvWaitKey(300) &gt; 0) { break; } } } </code></pre> <p>OpenCV implementation of Lucas-Kanade seems to be unable to track a rectangle on a binary image. Am I doing something wrong or does this function just not work?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload