【OpenCV】图片几何特征提取

【OpenCV】图片几何特征提取

2016年08月16日 16:57:18 番茄发烧了 阅读数:673

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bless2015/article/details/52222832

上一版不太好,又重新自己了一遍。

#include<cv.h>  
#include<highgui.h>  
using namespace cv;
using namespace std;
CvMemStorage *stroage;
IplImage *contourimage;
CvSeq *seq = NULL;
int ku = -1;
double pi = 3.141592;
int main()
{


    stroage = cvCreateMemStorage();
    Mat src = imread("E:\\14.jpg");
    Mat I;
    medianBlur(src, I, 3);
    //blur(src, I, Size(3, 3), Point(-1, -1));
    //GaussianBlur(src, I, Size(3, 3), 0, 0);
    //bilateralFilter(src, I, 5, 0.0, 10.0);
    contourimage = cvCreateImage(cvGetSize(&(CvMat)I), 8, 1);
    cvtColor(I, I, CV_BGR2GRAY);

    Mat contours;
    Canny(I, contours, 100, 255);
    threshold(contours, contours, 100, 255, CV_THRESH_TRUNC);
    int numcontours = cvFindContours(&(CvMat)contours, stroage, &seq, sizeof(CvContour), CV_RETR_LIST);

    CvMoments moments;
    CvHuMoments hu;
    cvMoments(&(CvMat)I, &moments, 0);
    cvGetHuMoments(&moments, &hu);

    if (ku != numcontours)
    {
        ku = numcontours;
        printf("contournum:::: %d \n", numcontours);
    }

    CvSeq *c = 0;
    int zz = 0;
    int totl = 0;

    cvSet(contourimage, cvScalar(255, 0, 255));
    cvSet(contourimage, cvScalar(125, 0, 125));
    CvPoint2D32f center;
    float radius;
    CvPoint2D32f rectpoint[4];

    CvContour *testcontour = 0;
    //c为轮廓顶点数组
    for (c = seq; c != NULL; c = c->h_next)
    {

        // 取得轮廓面积
        double testdbArea = fabs(cvContourArea(c, CV_WHOLE_SEQ));
        //取得轮廓长度
        double testdbLength = cvArcLength(c);

        c->block_max;

        if (testdbArea >= 50 && testdbLength <= 5000)
        {

            //点集的最外面(up-right)矩形边界
            CvRect testrect = cvBoundingRect(c);
            //轮廓最小外界矩形
            CvBox2D testbox = cvMinAreaRect2(c);
            //cvDrawContours(&(CvMat)contours, c, cvScalar(0, 255, 255), cvScalar(0, 255, 0), 0, 2);


            cvRectangle(&(CvMat)contours, cvPoint(testrect.x, testrect.y + testrect.height), cvPoint(testrect.x + testrect.width, testrect.y), cvScalar(255, 0, 255), 1);
            double width = testrect.width;
            double height = testrect.height;
            double juxingmianji = width*height;



            //找外界圆
            //cvMinEnclosingCircle(c, &center, &radius); 
            //cout <<  radius << endl;
            //cout << center.x << ";" << center.y << endl;
            //画外接圆
            //cvCircle(&(CvMat)contours, cvPointFrom32f(center), (int)radius, cvScalar(255, 0, 255), 2);

            //特征1矩形度
            float mianjibi = testdbArea / juxingmianji;
            //特征2延长度
            float changkuanbi = width / height;
            //特征3周长比
            float zhouchangbi = 2 * (height + width) / testdbLength;
            //特征4似圆度
            float r = 4 * pi*testdbArea / (testdbLength*testdbLength);
            //特征5形状复杂性
            float e = (testdbLength*testdbLength) / testdbArea;
            //不动点特征 hu.hu1    hu.hu2

            cout << "矩形度:" << mianjibi << endl;
            cout << "延长度:" << changkuanbi << endl;
            cout << "周长比:" << zhouchangbi << endl;
            cout << "似圆度:" << r << endl;
            cout << "形状复杂性:" << e << endl;
            cout << "一阶矩:" << hu.hu1 << endl;
            cout << "二阶矩:" << hu.hu2 << endl;

        }
    }
    namedWindow("Canny");
    imshow("Canny", contours);

    waitKey();
    return 0;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。
### 回答1: 要将三张图片拼接起来,可以使用OpenCV中的特征点检测和匹配算法。以下是一种基本的实现方法: 1. 读入三张图片并转换成灰度图: ```python import cv2 import numpy as np img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') img3 = cv2.imread('image3.jpg') gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) gray3 = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY) ``` 2. 对每张图片进行特征点检测和描述子提取: ```python sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) kp3, des3 = sift.detectAndCompute(gray3, None) ``` 3. 对每两张图片进行特征点匹配: ```python bf = cv2.BFMatcher() matches12 = bf.knnMatch(des1, des2, k=2) matches23 = bf.knnMatch(des2, des3, k=2) ``` 4. 选取匹配点对并进行筛选: ```python good_matches12 = [] for m,n in matches12: if m.distance < 0.75 * n.distance: good_matches12.append(m) good_matches23 = [] for m,n in matches23: if m.distance < 0.75 * n.distance: good_matches23.append(m) ``` 5. 计算变换矩阵并进行图像拼接: ```python MIN_MATCH_COUNT = 10 if len(good_matches12) > MIN_MATCH_COUNT and len(good_matches23) > MIN_MATCH_COUNT: src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches12]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches12]).reshape(-1, 1, 2) M12, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) src_pts = np.float32([kp2[m.queryIdx].pt for m in good_matches23]).reshape(-1, 1, 2) dst_pts = np.float32([kp3[m.trainIdx].pt for m in good_matches23]).reshape(-1, 1, 2) M23, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) h1, w1 = gray1.shape h2, w2 = gray2.shape h3, w3 = gray3.shape pts1 = np.float32([[0, 0], [0, h1], [w1, h1], [w1, 0]]).reshape(-1, 1, 2) pts2 = np.float32([[0, 0], [0, h2], [w2, h2], [w2, 0]]).reshape(-1, 1, 2) pts3 = np.float32([[0, 0], [0, h3], [w3, h3], [w3, 0]]).reshape(-1, 1, 2) dst1 = cv2.perspectiveTransform(pts1, M12) dst2 = cv2.perspectiveTransform(pts2, M12.dot(M23)) dst = np.concatenate((dst1, dst2, pts3), axis=0) warp_img1 = cv2.warpPerspective(img1, M12, (w2, h2)) warp_img2 = cv2.warpPerspective(img2, M12.dot(M23), (w3, h3)) result = np.zeros((int(dst[:, :, 1].max()), int(dst[:, :, 0].max()), 3), dtype=np.uint8) result[dst1[:, :, 1].min():dst1[:, :, 1].max(), dst1[:, :, 0].min():dst1[:, :, 0].max()] = warp_img1 result[dst2[:, :, 1].min():dst2[:, :, 1].max(), dst2[:, :, 0].min():dst2[:, :, 0].max()] = warp_img2 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这些代码将三张图片拼接在一起,并且可以自动处理图像的重叠部分。但是,这个方法有时会失败,因为它仅依赖于特征点的匹配。更复杂的算法可能需要使用多个图像,并且需要更先进的技术来对齐和融合图像。 ### 回答2: OpenCV是一个开源的计算机视觉库,可以用于处理图像和视频。在OpenCV中,可以通过提取图像特征点,来进行图像拼接。 图像特征点是图像中具有特殊属性的像素点,比如边缘、角点等。通过提取这些特征点,可以将图像进行对齐和拼接。 拼接三张图片的步骤如下: 1. 提取特征点:使用OpenCV中的特征点检测算法,比如SIFT(尺度不变特征变换)或SURF(加速稳健特征)算法,提取图像特征点。 2. 特征匹配:对提取到的特征点进行匹配,找到在不同图像中对应的特征点。可以使用OpenCV中的特征匹配算法,比如FLANN(近似最近邻匹配)和BFMatcher(暴力特征匹配)。 3. 图像对齐:通过计算特征点的几何变换关系,来对齐图像。可以使用OpenCV中的RANSAC(随机抽样一致性)算法,剔除错误的匹配点,得到准确的图像对齐结果。 4. 图像拼接:根据图像对齐的结果,对三张图像进行拼接。可以使用OpenCV中的透视变换算法,将对齐后的图像进行投影变换,实现图像的拼接。 最后得到的拼接图像中,三张原始图片经过对齐和拼接的处理,形成一个大的图像。这个过程可以通过使用OpenCV提供的特征点检测、特征匹配和图像变换等功能来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值