图像滤波
参考:
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;
}
}