Ранее я реализовал плотный оптический поток для вычисления скорости каждого пикселя в c ++. Этот пример мне очень помогает (https://github.com/Itseez/opencv/blob/master/samples/cpp/tvl1_optical_flow.cpp). Теперь я хочу преобразовать свой код в Java, но не могу найти эквивалентную функцию JavaCV для createOptFlow_DualTVL1 (). Кто-нибудь может мне помочь с этим? Было бы здорово, если бы это было с примером.
мой код в C ++ с использованием OpenCV выглядит так:
Mat New_Previous_Gray (holds the previous image)
Mat New_Current_Gray (holds the current image)
Mat_<Point2f> Optical_Flow;
Ptr<DenseOpticalFlow> tvl1 = createOptFlow_DualTVL1(); //This two lines is the want i want to change to JavaCV
tvl1->calc(New_Previous_Gray, New_Current_Gray, Optical_Flow); //This two lines is the want i want to change to JavaCV
double Pxl_Distance[Optical_Flow.rows][Optical_Flow.rows]; //will hold the velocity for every pixel
for(int y = 0; y < Optical_Flow.cols; y++)
{
for(int x = 0; x < Optical_Flow.rows; x++)
{
const Point2f& flow_xy = Optical_Flow.at<Point2f>(x, y);
int Vel_x = flow_xy.x;
int Vel_y = flow_xy.y;
Pxl_Distance = sqrt(double(((abs(Vel_x) * abs(Vel_x)) + (abs(Vel_y) * abs(Vel_y)))));
Pxl_Distance[x][y] = Pxl_Distance;
}
}
заранее спасибо
пока я работал над этим ниже, это код, который я придумал для вычисления оптического потока, может кто-нибудь сказать мне, что я делаю это правильно
IplImage pFrameGray = cvCreateImage(cvGetSize(pFront),IPL_DEPTH_8U,1);
IplImage cFrameGray = cvCreateImage(cvGetSize(pFront),IPL_DEPTH_8U,1);
cvConvertImage(pFront, pFrameGray, CV_CVTIMG_FLIP);
cvConvertImage(cFront, cFrameGray, CV_CVTIMG_FLIP);
IplImage Optical_Flow = cvCreateImage( cvSize(pFrameGray.width(),pFrameGray.height()), IPL_DEPTH_32F, 2 );
DenseOpticalFlow tvl1 = createOptFlow_DualTVL1();
tvl1.calc(pFrameGray, cFrameGray, Optical_Flow);
и если это правильно, то как я могу получить оптические значения из Optical_Flow (IplImage).
Спасибо
public void TestOF()
{
IplImage pFrame = cvLoadImage("/sdcard//DCIM/Camera/Frame-1.jpg");
IplImage cFrame = cvLoadImage("/sdcard//DCIM/Camera/Frame-2.jpg");
IplImage pGray = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);
IplImage cGray = cvCreateImage(cvGetSize(cFrame),IPL_DEPTH_8U,1);
cvConvertImage(pFrame, pGray, IPL_DEPTH_32F);
cvConvertImage(cFrame, cGray, IPL_DEPTH_32F);
IplImage Optical_Flow = cvCreateImage( cvGetSize(pGray), IPL_DEPTH_32F, 2 );
DenseOpticalFlow tvl1 = createOptFlow_DualTVL1();
tvl1.calc(pGray, cGray, Optical_Flow);
FloatBuffer buffer = Optical_Flow.getFloatBuffer();
CvMat OF = cvCreateMat( pGray.height(),pGray.width(), CV_32FC1);
int pixelVelocity =0;
int xVelocity = 0;
int yVelocity = 0;
int bufferIndex = 0;
for(int y =0; y< pGray.height(); y++)
{
for(int x = 0; x < pGray.width() ;x++)
{
xVelocity = (int)buffer.get(bufferIndex);
yVelocity = (int)buffer.get(bufferIndex+1);
pixelVelocity = (int)Math.sqrt((double)(xVelocity*xVelocity + yVelocity*yVelocity));
OF.put(y, x, pixelVelocity);
}
}
IplImage temp = OF.asIplImage();
cvSaveImage("/sdcard//DCIM/Camera/OF.jpg",temp);
}
Этот код будет вычислять оптический поток для каждого пикселя, используя DenseOpticalFlow между двумя изображениями (кадр-1 & Кадр-2) и поместите скорость каждого пикселя в пыльник изображения (OF) в их координате.
веселит.
Других решений пока нет …