c++ - JavaCV 中的密集光流 (DualTVL1)

标签 c++ opencv javacv opticalflow

我之前在 C++ 中实现了密集光流来计算每个像素的速度。这个例子对我帮助很大(https://github.com/Itseez/opencv/blob/master/samples/cpp/tvl1_optical_flow.cpp)。现在我想将我的代码转换为 java,但我找不到 createOptFlow_DualTVL1() 的等效 JavaCV 函数。有人可以帮我吗?如果有例子就好了。

我在 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) 中。 干杯。

关于c++ - JavaCV 中的密集光流 (DualTVL1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775981/

相关文章:

c++ - SRAND() 在代码块中不起作用?

c++ - gdb:选定框架上的信息局部信息

c++ - 我可以使用 clang 生成与旧 llvm 版本兼容的 llvm IR 吗?

python - 在图像opencv上画一个圆圈

c++ - opencv是否有用于将3D点转换为2D自上而下 View 的包

opencv - 如何创建自己的高斯内核?

android - JavaCV + Android Studio + gradle- 可能吗?

c++ - 创建大小为 m x n 的类 MAT

c++ - 使用 OpenCV 2.4.1 显示视频

java - 如何删除此异常 "Exception in thread "main"java.lang.UnsatisfiedLinkError : no jniopencv_objdetect in java. library.path"