Optical flow yöntemi, hareket kestirimi, nesne takibi, video stabilizasyonu(titreşim,hareket giderme), imge mozaikleme, stereo vision ile derinlik bilgisi eldesi gibi operasyonlarda sıklıkla kullanılan temel bir araçtır.
Genel olarak Optical flow yöntemi bir resimdeki noktanın diğer bir resimde nereye gittiğini bulmaktadır.
Burada OpenCV nin sağladığı fonksiyonlarla Lucas Kanade optical flow örneği bulunmakta. OpenCV kütüphanesinin C dili arayüzlerini kullnıarak geliştirilen bu uygulamayı C++ a çevirdim.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <opencv2/opencv.hpp> | |
#include <iostream> | |
#include <vector> | |
#include <cmath> | |
using namespace cv; | |
using namespace std; | |
int main(int argc, char** argv) | |
{ | |
// Load two images and allocate other structures | |
Mat imgA = imread("images/1.png", CV_LOAD_IMAGE_GRAYSCALE); | |
Mat imgB = imread("images/3.png", CV_LOAD_IMAGE_GRAYSCALE); | |
Size img_sz = imgA.size(); | |
Mat imgC(img_sz,1); | |
int win_size = 15; | |
int maxCorners = 20; | |
double qualityLevel = 0.05; | |
double minDistance = 5.0; | |
int blockSize = 3; | |
double k = 0.04; | |
std::vector<cv::Point2f> cornersA; | |
cornersA.reserve(maxCorners); | |
std::vector<cv::Point2f> cornersB; | |
cornersB.reserve(maxCorners); | |
goodFeaturesToTrack( imgA,cornersA,maxCorners,qualityLevel,minDistance,cv::Mat()); | |
goodFeaturesToTrack( imgB,cornersB,maxCorners,qualityLevel,minDistance,cv::Mat()); | |
cornerSubPix( imgA, cornersA, Size( win_size, win_size ), Size( -1, -1 ), | |
TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03 ) ); | |
cornerSubPix( imgB, cornersB, Size( win_size, win_size ), Size( -1, -1 ), | |
TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03 ) ); | |
// Call Lucas Kanade algorithm | |
CvSize pyr_sz = Size( img_sz.width+8, img_sz.height/3 ); | |
std::vector<uchar> features_found; | |
features_found.reserve(maxCorners); | |
std::vector<float> feature_errors; | |
feature_errors.reserve(maxCorners); | |
calcOpticalFlowPyrLK( imgA, imgB, cornersA, cornersB, features_found, feature_errors , | |
Size( win_size, win_size ), 5, | |
cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.3 ), 0 ); | |
// Make an image of the results | |
for( int i=0; i < features_found.size(); i++ ){ | |
cout<<"Error is "<<feature_errors[i]<<endl; | |
//continue; | |
cout<<"Got it"<<endl; | |
Point p0( ceil( cornersA[i].x ), ceil( cornersA[i].y ) ); | |
Point p1( ceil( cornersB[i].x ), ceil( cornersB[i].y ) ); | |
line( imgC, p0, p1, CV_RGB(255,255,255), 2 ); | |
} | |
namedWindow( "ImageA", 0 ); | |
namedWindow( "ImageB", 0 ); | |
namedWindow( "LKpyr_OpticalFlow", 0 ); | |
imshow( "ImageA", imgA ); | |
imshow( "ImageB", imgB ); | |
imshow( "LKpyr_OpticalFlow", imgC ); | |
cvWaitKey(0); | |
return 0; | |
} |
3 yorum - yorum yaz:
Eline sağlık.. Ben openCV kullanırken video kullanıyorum nede olsa framelere ayrılınca aynı jpeg kullanımı gibi oluyor.. Hareketli görüntülerle çalışmak işlemciyi çok yorsa da daha motive edici olduğunu düşünüyorum..
Yanlız C++ ' da göründüğü üzere daha kısa kodlarla işi halletmek mümkün ancak nesne kavramını anlamadan bu arayüze geçmemek lazım. Şimdilik C'ye devam.
Bu arada Mic.Visu.Studio'da çok çile çektiğim için DevC kullanmaktayım, ne de olsa arayüzü türkçe :D
Çok güzel bir yazı olmuş.
Özellikle projeye tüm kullanılan materyalleri eklemeniz çok işime yarıyacak.
Paylaşımlarınızın devamını bekliyorum.
Birde sorum olacak. Opencv
OpenCV-2.3.2-GPU-demo-pack-win32.exe
diye birşey çıkarmış içinde sanırım temel uygulamalar var ama ben çalıştıramadım sizce sebebi ne olabilir.
İyi günler
Teşekkür ederim Mesut Bey.
OpenCV-2.3.2-GPU-demo-pack-win32.exe den yeni haberdar oluyorum. İndirip kurdum. Konsolda aşağıdaki şekilde hata aldım.
OpenCV Error: Gpu Api call (CUDA driver version is insufficient for CUDA runtime
version) in unknown function, file ..\..\..\opencv\opencv\modules\gpu\src\gpuma
t.cpp, line 863
Cuda driverları aşağıdaki sayfada sunuluyor.
http://developer.nvidia.com/cuda-toolkit-31-downloads#Windows
Ancak bende nvidia ekran kartı olmadığı için bu driverları kuramadım. Uygulamayı da çalıştıramadım. Siz nasıl bir hata alıyorsunuz.
Yorum Gönder