Opencv vil_图像_视图到cv::Mat转换

Opencv vil_图像_视图到cv::Mat转换,opencv,image-processing,computer-vision,containers,Opencv,Image Processing,Computer Vision,Containers,有谁能给我推荐一个能将vil_image_view容器转换为cv::Mat容器的函数吗?我对尺寸的表示法感到困惑,即行数和高度、列数和宽度我的环境中没有安装VXL,我认为在您的情况下最好的办法是通过反复试验找到正确的代码。。。根据我的经验,阅读文档只是解决问题的一部分 话虽如此,我的第一个猜测是请记住,我没有测试代码: #include <vcl_iostream.h> #include <vxl_config.h> #include <vil/vil_rgb.h&

有谁能给我推荐一个能将vil_image_view容器转换为cv::Mat容器的函数吗?我对尺寸的表示法感到困惑,即行数和高度、列数和宽度

我的环境中没有安装VXL,我认为在您的情况下最好的办法是通过反复试验找到正确的代码。。。根据我的经验,阅读文档只是解决问题的一部分

话虽如此,我的第一个猜测是请记住,我没有测试代码:

#include <vcl_iostream.h>
#include <vxl_config.h>
#include <vil/vil_rgb.h>
#include <vil/vil_load.h>
#include <vil/vil_image_view.h>
#include "opencv2/core/core.hpp"

int main()
{
  vil_image_view<vil_rgb<vxl_byte> > img_src;
  img_src = vil_load("test.png");

  int n_rows = img_src.ni();
  int n_cols = img_src.nj();

  // see http://docs.opencv.org/doc/user_guide/ug_mat.html#accessing-pixel-intensity-values
  const int OPENCV_RED_INDEX   = 2;
  const int OPENCV_GREEN_INDEX = 1;
  const int OPENCV_BLUE_INDEX  = 0;

  // see http://stackoverflow.com/a/7903042/15485
  cv::Mat img_dst(n_rows, n_cols, CV_8UC3);
  for ( int r = 0; r < n_rows; r++ ) {
    for ( int c = 0; c < n_cols; c++ ) {
        img_dst.at<cv::Vec3b>(r,c)[OPENCV_RED_INDEX  ] = img_src(c,r).r;
        img_dst.at<cv::Vec3b>(r,c)[OPENCV_GREEN_INDEX] = img_src(c,r).g;
        img_dst.at<cv::Vec3b>(r,c)[OPENCV_BLUE_INDEX ] = img_src(c,r).b;
    }
  }

  return 0;
}
我的第二个猜测是:

#include <vcl_iostream.h>
#include <vxl_config.h>
#include <vil/vil_rgb.h>
#include <vil/vil_load.h>
#include <vil/vil_image_view.h>
#include "opencv2/core/core.hpp"

int main()
{
  vil_image_view<vil_rgb<vxl_byte> > img_src;
  img_src = vil_load("test.png");

  int n_rows = img_src.ni();
  int n_cols = img_src.nj();

  // see http://docs.opencv.org/doc/user_guide/ug_mat.html#accessing-pixel-intensity-values
  const int OPENCV_RED_INDEX   = 2;
  const int OPENCV_GREEN_INDEX = 1;
  const int OPENCV_BLUE_INDEX  = 0;

  // see http://stackoverflow.com/a/7903042/15485
  cv::Mat img_dst(n_rows, n_cols, CV_8UC3);
  for ( int r = 0; r < n_rows; r++ ) {
    for ( int c = 0; c < n_cols; c++ ) {
        img_dst.at<cv::Vec3b>(r,c)[OPENCV_RED_INDEX  ] = img_src(r,c).r;
        img_dst.at<cv::Vec3b>(r,c)[OPENCV_GREEN_INDEX] = img_src(r,c).g;
        img_dst.at<cv::Vec3b>(r,c)[OPENCV_BLUE_INDEX ] = img_src(r,c).b;
    }
  }

  return 0;
}

什么是vil_image_view容器?它来自vxl库,比如OpenCVI,它应该是int n_cols=img_src.ni;int n_rows=img_src.nj@你好,我看到你接受了答案,谢谢。如果你有一个工作代码,请更新我的答案,以便将来的用户参考。非常感谢。