Linux에서 OpenCV 2.4.2를 사용하고 있습니다. 나는 C++로 글을 쓰고있다. 간단한 개체 (예 : 흰색 배경에 검은 색 사각형)를 추적하고 싶습니다. 우선 goodFeaturesToTrack을 사용하고 나서 다른 이미지에서 해당 점을 찾기 위해 calcOpticalFlowPyrLK를 사용하고 있습니다. 문제는 calcOpticalFlowPyrLK가 이러한 점을 찾지 못한다는 것입니다.OpenCV 2.4.2 calcOpticalFlowPyrLK가 포인트를 찾지 못했습니다.
나는 내 경우에는 작동하지 않는 C, 그것을 수행하는 코드 발견 : http://dasl.mem.drexel.edu/~noahKuntz/openCVTut9.html
나 C++로 변환 한 :
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<Point2f> cornersA;
goodFeaturesToTrack(imgAgray, cornersA, 30, 0.01, 30);
for (unsigned int i = 0; i < cornersA.size(); i++) {
drawPixel(cornersA[i], &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<Point2f> cornersB;
vector<uchar> status;
vector<float> 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 < cornersB.size(); i++) {
if (status[i] == 0 || error[i] > 0) {
drawPixel(cornersB[i], &imgC, 2, red);
continue;
}
drawPixel(cornersB[i], &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;
}
ImageA : http://oi50.tinypic.com/14kv05v.jpg
을 ImageB : http://oi46.tinypic.com/4l3xom.jpg
ImageC : http://oi47.tinypic.com/35n3uox.jpg
나는 그것이 winsize = 11에서만 작동한다는 것을 알아 냈습니다. 이동하는 사각형에서 원점에서 얼마나 멀리 떨어져 있는지 확인하려고했습니다. 네 모서리를 거의 감지하지 못합니다. 루카스 - Kanade의
int main(int, char**) {
std::cout << "Compiled at " << __TIME__ << 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<Point2f> features;
goodFeaturesToTrack(org, features, 30, 0.01, 30);
std::cout << "POINTS FOUND:" << std::endl;
for (unsigned int i = 0; i < features.size(); i++) {
std::cout << "Point found: " << features[i].x;
std::cout << " " << features[i].y << std::endl;
}
bool goRight = 1;
while (1) {
if (goRight) {
rect.x += 30;
rect.y += 30;
if (rect.x >= 250) {
goRight = 0;
}
} else {
rect.x -= 30;
rect.y -= 30;
if (rect.x <= 50) {
goRight = 1;
}
}
Mat frame = Mat(Size(640, 480), CV_8UC1, white);
rectangle(frame, rect, black, -1, 0, 0);
vector<Point2f> found;
vector<uchar> status;
vector<float> 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 < found.size(); i++) {
if (status[i] == 0 || error[i] > 0) {
continue;
} else {
line(display, features[i], found[i], red);
}
}
namedWindow("window", 1);
moveWindow("window", 50, 50);
imshow("window", display);
if (cvWaitKey(300) > 0) {
break;
}
}
}
OpenCV의 구현은 바이너리 이미지에 사각형을 추적 할 수없는 것 같다. 잘못되었거나이 기능이 작동하지 않습니까?
예, 자연 사진으로 시도했습니다. 나는 수백 가지의 이미지에서 최대 150 크기의 창 크기와 최대 100 크기까지 테스트 해왔다. 그 값들 중 어느 것도 1 점조차도 발견하지 못했습니다. –
글쎄, 그건 정상적인 행동이 아니야. 나는 개인적으로 openCV를 사용하기 위해 장애물을 가지고 있었지만, 나는 그것을 정말로 똑바로 찾고 예제/문서를 찾지 못했다. ViSP (GPL) [ViSP 웹 사이트] (http://www.irisa.fr/lagadic/visp/visp.html)에 시도해 볼 수 있습니다. KLT로 도트 추적에 대한 자습서가 있습니다. – StackHola