Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing OpenCV显示双通道图像(光流)_Image Processing_Opencv - Fatal编程技术网

Image processing OpenCV显示双通道图像(光流)

Image processing OpenCV显示双通道图像(光流),image-processing,opencv,Image Processing,Opencv,我将光流存储在一个2通道32F矩阵中。我想把内容形象化,最简单的方法是什么 如何将CV_32FC2转换为带有空蓝色通道的RGB,这是imshow可以处理的?我使用OpenCV 2 C++ ++ API。 超级积分 理想情况下,我会得到色调的流动角度和亮度的大小(饱和度恒定为100%) imshow只能处理1通道灰度和3-4通道BRG/BGRA图像。所以你需要自己做一个转换 我认为你可以做类似的事情: //extraxt x and y channels cv::Mat xy[2]; //X,Y

我将光流存储在一个2通道32F矩阵中。我想把内容形象化,最简单的方法是什么

如何将
CV_32FC2
转换为带有空蓝色通道的RGB,这是
imshow
可以处理的?我使用OpenCV 2 C++ ++ API。 超级积分
理想情况下,我会得到色调的流动角度和亮度的大小(饱和度恒定为100%)

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);
提供了用于可视化计算流的C和MatLab代码。从下载培训集的地面真实光流。存档包含一个文件夹
flow\u code
,其中包含上述源代码

您可以将代码移植到OpenCV,但是,我编写了一个简单的OpenCV包装器,以便轻松使用提供的代码。请注意,方法
MotionToColor
取自
color\u 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 ...
//在flowIO.h之前包含这一点很重要!
#包括“imageLib.h”
#包括“flowIO.h”
#包括“colorcode.h”
//我在一个单独的头文件中移动了MotionToColor方法。
#包括“motiontocolor.h”
cv::垫流;
//计算光流(例如,使用OpenCV);结果应该是
//双通道浮点矩阵。
断言(flow.channels()==2);
//断言(flow.type()==CV_32F);
int rows=flow.rows;
int cols=flow.cols;
CFloatImage cFlow(列,行,2);
//将流转换为CFLoatImage:
对于(int i=0;i
下面是使用光流代码和提供的示例图像时的结果


你们是在问稠密光流(用calcOpticalFlowFarneback计算)吗?你们中有谁能告诉我如何将2通道图像转换为3通道或1通道图像?我不知道2频道的确切格式。谢谢