Visp系列學習三:kinectV2 + visp下的圖像處理

圖像濾波

參考:
Image filtering

使用kienctV2採集圖像後通過visp_ros讀取圖像並進行高斯平滑濾波,一階梯度濾波,二階梯度濾波,Canny濾波,Sobel濾波,高斯金字塔尺度變換。
在這裏插入圖片描述

在這裏插入圖片描述

圖像自適應閾值分割 在這裏插入圖片描述

源代碼

tutorial-ros-filtering.cpp
//! \example tutorial-ros-filtering.cpp
#include <visp/vpDisplayX.h>
#include <visp/vpImage.h>
#include <visp_ros/vpROSGrabber.h>
#include <visp3/core/vpImageFilter.h>
#include <visp3/gui/vpDisplayD3D.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayGTK.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h>
#if defined(VISP_HAVE_MODULE_IMGPROC)
#include <visp3/imgproc/vpImgproc.h>
#endif

void display(vpImage<unsigned char> &I, const std::string &title);
void display(vpImage<double> &D, const std::string &title);
void display(vpImage<unsigned char> &I, const std::string &title)
{
#if defined(VISP_HAVE_X11)
  vpDisplayX d(I); 
#elif defined(VISP_HAVE_OPENCV)
  vpDisplayOpenCV d(I);
#elif defined(VISP_HAVE_GTK)
  vpDisplayGTK d(I);
#elif defined(VISP_HAVE_GDI)
  vpDisplayGDI d(I);
#elif defined(VISP_HAVE_D3D9)
  vpDisplayD3d d(I);
#else
  std::cout << "No image viewer is available..." << std::endl;
#endif
  vpDisplay::setTitle(I, title.c_str());
  vpDisplay::display(I);
  vpDisplay::displayText(I, 15, 15, "Click to continue...", vpColor::red);
  vpDisplay::flush(I);
  vpDisplay::getClick(I);
}
void display(vpImage<double> &D, const std::string &title)
{
  vpImage<unsigned char> I; // Image to display
  vpImageConvert::convert(D, I);
  display(I, title);
}


int main(int argc, const char** argv)
{
  try {
    bool opt_use_camera_info = false;
    for (int i=0; i<argc; i++) {
      if (std::string(argv[i]) == "--use-camera-info")
        opt_use_camera_info = true;
      else if (std::string(argv[i]) == "--help") {
        std::cout << "Usage: " << argv[0]
                  << " [--use-camera-info] [--help]"
                  << std::endl;
        return 0;
      }
    }
    std::cout << "Use camera info: " << ((opt_use_camera_info == true) ? "yes" : "no") << std::endl; 
    //vpImage<unsigned char> I; // Create a gray level image container
    //vpImage<vpRGBa> I; // Create a color image container
    vpImage<unsigned char> I; //auto convert to gray image 
    //! [Construction]
    vpROSGrabber g; // Create a grabber based on ROS
    //! [Construction] 
    //! [Setting camera topic]
    g.setImageTopic("/kinect2/qhd/image_color");
    //! [Setting camera topic]
    //! [Setting camera info]
    if (opt_use_camera_info) {
      g.setCameraInfoTopic("/kinect2/qhd/camera_info");
      g.setRectify(true);
    }
    //! [Setting camera info]

    //! [Opening]
    g.open(I);
    //! [Opening]
    std::cout << "Image size: " << I.getWidth() << " " << I.getHeight() << std::endl;

#ifdef VISP_HAVE_X11
    vpDisplayX d(I);
     vpDisplayX d_th(I);
#else
    std::cout << "No image viewer is available..." << std::endl;
#endif
 
    while(1) {
      //! [Acquisition]
      g.acquire(I);
      //! [Acquisition]
      vpDisplay::display(I);
      vpDisplay::displayText(I, 20, 20, "A click to quit...", vpColor::red);
      vpDisplay::flush(I);
      vpImage<double> F; 
      vpImageFilter::gaussianBlur(I,F);
      display(F,"Blur(default)");
      vpImage<double> dIx;
      vpImageFilter::getGradX(I,dIx);
      vpImageFilter::gaussianBlur(I, F, 7, 2);
      display(F, "Blur (var=2)");  
      vpImage<double> dIx2;
      vpImageFilter::getGradX(I, dIx2);
      display(dIx2, "Gradient dIx2");
       vpImage<double> dIy;
       vpImageFilter::getGradY(I, dIy);
        display(dIy, "Gradient dIy");
    #if (VISP_HAVE_OPENCV_VERSION >= 0x020100)
        vpImage<unsigned char> C;
        vpImageFilter::canny(I, C, 5, 15, 3);
        display(C, "Canny");
    #endif
        vpMatrix K(3, 3); // Sobel kernel along x
        K[0][0] = 1;
        K[0][1] = 0;
        K[0][2] = -1;
        K[1][0] = 2;
        K[1][1] = 0;
        K[1][2] = -2;
        K[2][0] = 1;
        K[2][1] = 0;
        K[2][2] = -1;
        vpImage<double> Gx;
        vpImageFilter::filter(I, Gx, K);
        display(Gx, "Sobel x");
        size_t nlevel = 3;
        std::vector<vpImage<unsigned char> > pyr(nlevel);
        pyr[0] = I;
        for (size_t i = 1; i < nlevel; i++) {
        vpImageFilter::getGaussPyramidal(pyr[i - 1], pyr[i]);
        display(pyr[i], "Pyramid"); 
        }

        
         vpImage<unsigned char> I_huang = I;
        vp::autoThreshold(I_huang, vp::AUTO_THRESHOLD_HUANG);
        I.insert(I_huang, vpImagePoint());
 

        vpDisplay::display(I);
        vpDisplay::displayText(I, 30, 20, "Huang", vpColor::red); 
        vpDisplay::flush(I); 

        if (vpDisplay::getClick(I, false))
            break;
    }
  }
  catch(vpException e) {
    std::cout << "Catch an exception: " << e << std::endl;
  }
}

tutorial-ros-adjustment.cpp
#include <cstdlib>
#include <iostream>
#include <visp3/core/vpImage.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h> 
#if defined(VISP_HAVE_MODULE_IMGPROC)
#include <visp3/imgproc/vpImgproc.h>
#endif
#include <visp_ros/vpROSGrabber.h>

int main(int argc, const char** argv)
{
    try {  
        vpImage<unsigned char> I_grey; 
        vpROSGrabber g; // Create a grabber based on ROS
          
        g.setImageTopic("/kinect2/qhd/image_color"); 
        g.open(I_grey);     
        vpDisplayX d(I_grey);  
        while(1) {  
            g.acquire(I_grey);    
            vp::autoThreshold(I_grey, vp::AUTO_THRESHOLD_OTSU);
            vpDisplay::display(I_grey); 
            vpDisplay::flush(I_grey); 
  
            if (vpDisplay::getClick(I_grey, false))
                break;
        }
    }
    catch(vpException e) {
        std::cout << "Catch an exception: " << e << std::endl;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章