首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示双通道图像的OpenCV (光流)

显示双通道图像的OpenCV (光流)
EN

Stack Overflow用户
提问于 2011-10-08 06:46:37
回答 2查看 16.5K关注 0票数 11

我将光流存储在一个双通道32F矩阵中。我想可视化内容,最简单的方法是什么?

如何将CV_32FC2转换为具有空蓝色通道的RGB,这是imshow可以处理的?我正在使用OpenCV 2 C++ API。

超级加分

理想情况下,我会得到色调的流动角和亮度的大小(饱和度为恒定的100%)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-08 23:01:25

imshow只能处理1通道灰度和3-4通道的灰度图像。所以你需要自己做一个转换。

我认为你可以做一些类似的事情:

代码语言:javascript
运行
复制
//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);
票数 21
EN

Stack Overflow用户

发布于 2015-03-23 05:50:32

MPI Sintel Dataset提供了用于可视化计算流程的C和MatLab代码。从here下载训练集的地面实况光流。归档文件中包含一个文件夹flow_code,其中包含提到的源代码。

您可以将代码移植到OpenCV,但是,我编写了一个简单的OpenCV包装器来方便地使用所提供的代码。请注意,方法MotionToColor取自color_flow.cpp文件。请注意下面清单中的注释。

代码语言:javascript
运行
复制
// 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 ...

以下是使用Ce Liu提供的光流代码和示例图像时的结果。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7693561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档