OpenCV学习实践(4) opencv代码学习实践:Extract horizontal and vertical lines by using morphological operations

0.功能

        使用形态学操作morphological operations提取出图像中水平线和数值线horizontal and vertical lines,即分别让图像的水平部分或竖直部分更凸显出来

1.工作空间准备

        为了使这个单一的cpp文件能够执行,进行如下操作.

mkdir -p opencv_hv/src 
cd opencv_hv/src 
catkin_create_pkg image_proc std_msgs roscpp rospy cv_bridge
cd ../..
gedit hv.launch

        在hv.launch文件中粘贴下述代码段,保存并关闭

<launch>
    <node pkg="image_processing" type="horizontal_and_vertical_line_node" name="horizontal_and_vertical_line" output="screen" />
</launch>

         工作空间结构如下:

# meng @ meng in ~/opencv_hv [22:28:30] 
$ tree           
.
├── hv.launch
└── src
    └── image_proc
        ├── CMakeLists.txt
        ├── include
        │   └── image_proc
        ├── package.xml
        └── src

5 directories, 3 files

2.程序准备与解读

        在/home/meng/opencv_hv/src/image_proc/src 文件夹下添加如下文件:  horizontal_and_vertical_line_node.cpp

// Extract horizontal and vertical lines by using morphological operations 
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
void show_wait_destroy(const char* winname, cv::Mat img);
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
    /*CommandLineParser parser(argc, argv, "{@input | notes.png | input image}");
    Mat src = imread( samples::findFile( parser.get<String>("@input") ), IMREAD_COLOR);
    官方示例是这两行,使用起来相对麻烦,这里改为下面这一行*/
    Mat src = imread( "/home/meng/my_learning/opencv_test/src/image_processing/src/note.png", IMREAD_COLOR);//彩色图像
    if (src.empty())
    {
        cout << "Could not open or find the image!\n" << endl;
        cout << "Usage: " << argv[0] << " <Input image>" << endl;
        return -1;
    }
    // Show source image
    imshow("src", src);
    // Transform source image to gray if it is not already
    Mat gray;
    if (src.channels() == 3)//如果为3通道
    {   //BGR彩色转为灰度图,这是为了方便下面处理
        cvtColor(src, gray, COLOR_BGR2GRAY);
    }
    else
    {
        gray = src;
    }
    // Show gray image
    show_wait_destroy("gray", gray);
    // Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
    Mat bw;
    /*adaptiveThreshold:自适应阈值函数  
      ~gray, bw: ~按位不,源图像和目标图像    255:maxValue最大值  
      ADAPTIVE_THRESH_MEAN_C:(x,y):每个位置像素值的阈值,邻域blockSize*blockSize范围内的均值再减去C的值
      thresholdType:阈值类型,这里每个位置处的像素值大于相应阈值则该位置处设为maxValue
      15:blockSize的值   -2:C值  
      下面使原来"亮"的地方更暗,"暗"的地方更亮
    */
    adaptiveThreshold(~gray, bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
    // Show binary image
    show_wait_destroy("binary", bw);
    // Create the images that will use to extract the horizontal and vertical lines 提取水平和竖值线
    Mat horizontal = bw.clone();
    Mat vertical = bw.clone();
    // Specify size on horizontal axis
    int horizontal_size = horizontal.cols / 30;
    // Create structure element for extracting horizontal lines through morphology operations
    //构建结构单元:形状及大小
    Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontal_size, 1));
    // Apply morphology operations
    erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));
    dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));
    // Show extracted horizontal lines
    show_wait_destroy("horizontal", horizontal);
    // Specify size on vertical axis
    int vertical_size = vertical.rows / 30;
    // Create structure element for extracting vertical lines through morphology operations
    Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, vertical_size));
    // Apply morphology operations
    erode(vertical, vertical, verticalStructure, Point(-1, -1));
    dilate(vertical, vertical, verticalStructure, Point(-1, -1));
    // Show extracted vertical lines
    show_wait_destroy("vertical", vertical);
    // Inverse vertical image
    bitwise_not(vertical, vertical);
    show_wait_destroy("vertical_bit", vertical);
    // Extract edges and smooth image according to the logic
    // 1. extract edges
    // 2. dilate(edges)
    // 3. src.copyTo(smooth)
    // 4. blur smooth img
    // 5. smooth.copyTo(src, edges)
    // Step 1   获取高亮区域边缘
    Mat edges;
    adaptiveThreshold(vertical, edges, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
    show_wait_destroy("edges", edges);
    // Step 2   使高亮区域边缘更明显
    Mat kernel = Mat::ones(2, 2, CV_8UC1);
    dilate(edges, edges, kernel);
    show_wait_destroy("dilate", edges);
    // Step 3   
    Mat smooth;
    vertical.copyTo(smooth);//把vertical内容复制到smooth上
    show_wait_destroy("smooth_3", smooth);
    // Step 4   平滑滤波
    blur(smooth, smooth, Size(2, 2));
    show_wait_destroy("smooth_4", smooth);
    // Step 5  函数:image.copyTo(imageROI,mask) 
    //作用是把mask和image重叠以后把mask中像素值为0(black)的点对应的image中的点变为透明,而保留其他点。
    smooth.copyTo(vertical, edges);
    // Show final result
    show_wait_destroy("smooth - final", vertical);
    return 0;
}
void show_wait_destroy(const char* winname, cv::Mat img) {
    imshow(winname, img);
    moveWindow(winname, 500, 0);
    waitKey(0);
    destroyWindow(winname);
}

        同时修改/home/meng/opencv_hv/src/image_proc/CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.0.2)
project(image_processing)

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  roscpp
  rospy
  std_msgs
)
find_package(OpenCV REQUIRED)
catkin_package()


include_directories(
# include
  ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}
)

add_executable(horizontal_and_vertical_line_node src/horizontal_and_vertical_line_node.cpp)
target_link_libraries(horizontal_and_vertical_line_node
  ${catkin_LIBRARIES} ${OpenCV_LIBS}
)


3.程序运行        

        回到:/home/meng/opencv_hv,

        效果如图

catkin_make
source devel/setup.bash
#或source devel/setup.zsh
roslaunch hv.launch

src

gray

binary

horizontal

vertical

vertical_blt

edge

somth_final

参考链接:

(1).adaptiveThreshold():https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#ga72b913f352e4a1b1b397736707afcde3

(2):https://docs.opencv.org/master/dd/dd7/tutorial_morph_lines_detection.html

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt 5和OpenCV 4是两个流行的计算机视觉库,用于跨平台开发计算机视觉项目。Qt是一个功能强大的GUI框架,提供了丰富的界面设计和开发工具,而OpenCV则是一个出色的计算机视觉库,提供了各种各样的图像处理和分析功能。 使用Qt 5和OpenCV 4开发计算机视觉项目,可以帮助开发者快速地开发功能强大且跨平台的应用。首先,Qt提供了直观且易于使用的界面设计工具,使得用户可以轻松创建交互式界面。同时,Qt还提供了丰富的控件库和布局管理器,方便开发者进行界面元素的设计和排列。 OpenCV 4则为图像处理和分析提供了强大的功能。它支持各种常用的图像操作,如图像旋转、缩放、滤波等。它还提供了深度学习模块,可以用于目标检测、人脸识别等高级计算机视觉任务。OpenCV 4还具有高度优化的算法和多种图像处理技术,使得开发者可以快速地实现各种图像处理任务。 使用Qt 5和OpenCV 4开发计算机视觉项目时,需要配置正确的环境和库依赖。首先,需要下载和安装Qt和OpenCV的最新版本。然后,需要在Qt项目中配置OpenCV库,并编写与Qt交互的代码。在项目中,可以利用Qt的界面设计工具进行界面设计,然后使用OpenCV的功能进行图像处理和分析。 总之,Qt 5和OpenCV 4是开发计算机视觉项目的强大工具。它们提供了丰富的功能和易于使用的界面设计工具,可以帮助开发者快速构建跨平台的计算机视觉应用。 ### 回答2: Qt 5和OpenCV 4计算机视觉项目:快速上手跨平台 Qt 5是一种跨平台的C++应用程序框架,可以用于开发各种类型的应用程序,包括计算机视觉项目。同时,OpenCV 4是一个广泛使用的计算机视觉库,提供了各种图像处理和计算机视觉算法。由于两者的互补性,使用Qt 5和OpenCV 4的组合能够实现强大的计算机视觉应用。 Qt 5提供了简洁的GUI编程接口和丰富的图形操作功能,可以快速创建用户友好的计算机视觉应用界面。通过使用Qt的信号和槽机制,可以方便地将视觉处理和用户交互结合起来,使得应用程序更加灵活和易用。 OpenCV 4为计算机视觉项目提供了一系列高性能的图像处理和算法模块。它支持多种图像格式,可以进行图像预处理、特征提取、目标检测、图像分割等一系列视觉任务。而且,由于OpenCV是使用C++编写的,与Qt 5的C++编程模型非常契合,可以无缝集成两者,实现更加复杂的计算机视觉项目。 在开始使用Qt 5和OpenCV 4进行计算机视觉项目之前,需要准备好相关的开发环境。首先,确保正确安装了Qt和OpenCV的开发工具包,并配置好相关的路径。其次,创建一个新的Qt项目,并将OpenCV库添加到项目中。 在编写代码时,可以使用Qt的GUI组件来构建应用程序的用户界面。然后,通过OpenCV的函数,读取和处理图像数据。可以使用OpenCV提供的各种函数来实现不同的视觉算法和任务。最后,将处理后的图像数据与Qt的图形界面进行交互,展示处理结果。 综上所述,Qt 5和OpenCV 4是一对强大的组合,可以用于开发各种计算机视觉项目。通过使用它们,我们可以快速开发出跨平台的计算机视觉应用,提高图像处理和分析的效率。无论是图像处理、目标识别还是深度学习等领域,Qt 5和OpenCV 4的结合都可以为我们带来更多的机会和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值