opencv3/C++图像边缘提取

canny算子实现

使用track bar 调整canny算子参数,提取到合适的图像边缘。

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;

void trackBar(int, void*);
int s1=0,s2=0;
Mat src, dst;
int main()
{
    src = imread("E:/image/image/daibola.jpg");
    if(src.empty())
    {
        printf("can not load image \n");
        return -1;
    }
    cvNamedWindow("input", CV_WINDOW_AUTOSIZE);
    imshow("input", src);
    dst = src.clone();
    cvNamedWindow("output", CV_WINDOW_AUTOSIZE);
    createTrackbar("canny1", "output", &s1, 255, trackBar);
    createTrackbar("canny2", "output", &s2, 255, trackBar);
    GaussianBlur(src,src,Size(3,3),0);

    waitKey();
    return 0;
}

void trackBar(int, void*)
{

    Canny(src,dst,s1,s2,3);
    imshow("output", dst);
}

这里写图片描述
这里写图片描述

Sobel算子实现

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat src, dst;
    src = imread("E:/image/image/daibola.jpg");

    if(src.empty())
    {
        printf("can not load image \n");
        return -1;
    }
    dst = Mat::zeros(src.size(), src.type());
    cvNamedWindow("input", CV_WINDOW_AUTOSIZE);
    imshow("input", src);   

    Mat kernel = (Mat_<int>(2,2)<<0,1,-1,0);
    filter2D(src,dst,-1,kernel,Point(-1,-1),0.0);
    Mat xgrad, ygrad;
    Sobel(src,xgrad,CV_16S,1,0,3);
    Sobel(src,ygrad,CV_16S,0,1,3);
    convertScaleAbs(xgrad,xgrad);
    convertScaleAbs(ygrad,ygrad);

    addWeighted(xgrad,0.5,ygrad,0.5,0,dst);
    //addWeighted(dst,0.5,src,1,0,dst);
    cvNamedWindow("output", CV_WINDOW_AUTOSIZE);
    imshow("output", dst);
    waitKey();
    return 0;
}

这里写图片描述
这里写图片描述

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OpenCV是一个流行的计算机视觉库,提供了许多图像处理和计算机视觉算法。轮廓提取是OpenCV中的一个重要功能,它可以用于检测图像中的形状和物体。 在Java中使用OpenCV进行轮廓提取,可以使用OpenCV的Java接口。以下是基本的轮廓提取代码示例: ``` Mat src = Imgcodecs.imread("input.jpg"); Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); Imgproc.Canny(gray, gray, 100, 200); List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchy = new Mat(); Imgproc.findContours(gray, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); ``` 这段代码读取输入图像,将其转换为灰度图像,使用Canny算子进行边缘检测,然后使用findContours函数提取轮廓。这个函数返回一个包含所有轮廓的MatOfPoint列表,以及一个包含层次结构信息的Mat。 在C++中,轮廓提取与Java非常相似。以下是一个简单的例子: ``` cv::Mat src = cv::imread("input.jpg"); cv::Mat gray; cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); cv::Canny(gray, gray, 100, 200); std::vector<std::vector<cv::Point>> contours; cv::findContours(gray, contours, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); ``` 这段代码也读取输入图像,将其转换为灰度图像,使用Canny算子进行边缘检测,然后使用findContours函数提取轮廓。这个函数返回一个包含所有轮廓的vector<vector<Point>>列表。 在Java或C++中,提取轮廓后可能需要对它们进行筛选,以便只保留感兴趣的轮廓。例如,可以使用轮廓的面积、周长或形状等特征来筛选轮廓。以下是一个简单的示例,仅保留面积大于100的轮廓: Java: ``` List<MatOfPoint> filteredContours = new ArrayList<>(); for (MatOfPoint contour : contours) { double area = Imgproc.contourArea(contour); if (area > 100) { filteredContours.add(contour); } } ``` C++: ``` std::vector<std::vector<cv::Point>> filteredContours; for (const auto& contour : contours) { double area = cv::contourArea(contour); if (area > 100) { filteredContours.push_back(contour); } } ``` 这个例子计算每个轮廓的面积,然后仅保留面积大于100的轮廓。可以根据需求使用不同的特征和阈值来筛选轮廓。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值