Mat*_*tag 10 opencv image-processing
我的光流存储在2通道32F矩阵中.我想要想象内容,最简单的方法是什么?
如何CV_32FC2
使用空蓝色通道将a转换为RGB,有什么imshow
可以处理?我正在使用OpenCV 2 C++ API.
理想情况下,我会得到色调中的流动角度和亮度的大小(饱和度恒定为100%).
And*_*aev 20
imshow
只能处理1通道灰度和3-4通道BRG/BGRA图像.所以你需要自己做一个转换.
我想你可以做类似的事情:
//extraxt x and y channels
cv::Mat xy[2]; //X,Y
cv::split(flow, xy);
//calculate angle and magnitude
cv::Mat magnitude, angle;
cv::cartToPolar(xy[0], xy[1], magnitude, angle, true);
//translate magnitude to range [0;1]
double mag_max;
cv::minMaxLoc(magnitude, 0, &mag_max);
magnitude.convertTo(magnitude, -1, 1.0 / mag_max);
//build hsv image
cv::Mat _hsv[3], hsv;
_hsv[0] = angle;
_hsv[1] = cv::Mat::ones(angle.size(), CV_32F);
_hsv[2] = magnitude;
cv::merge(_hsv, 3, hsv);
//convert to BGR and show
cv::Mat bgr;//CV_32FC3 matrix
cv::cvtColor(hsv, bgr, cv::COLOR_HSV2BGR);
cv::imshow("optical flow", bgr);
cv::waitKey(0);
Run Code Online (Sandbox Code Playgroud)
的MPI辛特尔数据集提供C和MATLAB代码用于可视化计算的流程.从这里下载训练集的地面实况光流.存档包含一个flow_code
包含所提到的源代码的文件夹.
您可以将代码移植到OpenCV,但是,我编写了一个简单的OpenCV包装器来轻松使用提供的代码.请注意,该方法MotionToColor
取自该color_flow.cpp
文件.请注意下面列表中的注释.
// Important to include this before flowIO.h!
#include "imageLib.h"
#include "flowIO.h"
#include "colorcode.h"
// I moved the MotionToColor method in a separate header file.
#include "motiontocolor.h"
cv::Mat flow;
// Compute optical flow (e.g. using OpenCV); result should be
// 2-channel float matrix.
assert(flow.channels() == 2);
// assert(flow.type() == CV_32F);
int rows = flow.rows;
int cols = flow.cols;
CFloatImage cFlow(cols, rows, 2);
// Convert flow to CFLoatImage:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cFlow.Pixel(j, i, 0) = flow.at<cv::Vec2f>(i, j)[0];
cFlow.Pixel(j, i, 1) = flow.at<cv::Vec2f>(i, j)[1];
}
}
CByteImage cImage;
MotionToColor(cFlow, cImage, max);
cv::Mat image(rows, cols, CV_8UC3, cv::Scalar(0, 0, 0));
// Compute back to cv::Mat with 3 channels in BGR:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
image.at<cv::Vec3b>(i, j)[0] = cImage.Pixel(j, i, 0);
image.at<cv::Vec3b>(i, j)[1] = cImage.Pixel(j, i, 1);
image.at<cv::Vec3b>(i, j)[2] = cImage.Pixel(j, i, 2);
}
}
// Display or output the image ...
Run Code Online (Sandbox Code Playgroud)
以下是使用Ce Liu提供的光流代码和示例图像时的结果.
归档时间: |
|
查看次数: |
13268 次 |
最近记录: |