首页 > 其他分享 >opencv PCA 主轴方向角度范围

opencv PCA 主轴方向角度范围

时间:2024-10-27 16:34:11浏览次数:5  
标签:pca 主轴 int double opencv PCA pts cv

PCA 主轴方向角度,范围    [-45,135] 
点集排序(从左到右、从右至左)不同,角度在-45度时有差异

double calLineOrientationInDegree(const vector<Point>& pts)
{
    //Construct a buffer used by the pca analysis
    int sz = static_cast<int>(pts.size());
    Mat data_pts = Mat(sz, 2, CV_64F);
    for (int i = 0; i < data_pts.rows; i++)
    {
        data_pts.at<double>(i, 0) = pts[i].x;
        data_pts.at<double>(i, 1) = pts[i].y;
    }
    //Perform PCA analysis
    PCA pca_analysis(data_pts, Mat(), PCA::DATA_AS_ROW);
    //Store the center of the object
    Point2d cntr = Point2d(static_cast<double>(pca_analysis.mean.at<double>(0, 0)),
        static_cast<double>(pca_analysis.mean.at<double>(0, 1)));
    //Store the eigenvalues and eigenvectors
    vector<Point2d> eigen_vecs(2);
    vector<double> eigen_val(2);
    for (int i = 0; i < 2; i++)
    {
        eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0),
            pca_analysis.eigenvectors.at<double>(i, 1));
        eigen_val[i] = pca_analysis.eigenvalues.at<double>(i);
    }
    
    eigenVecs = eigen_vecs;
    double angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x) * 180 / 3.1415926; // orientation in degrees 
    return angle;
}

// 测试PCA 主轴角度范围
// 点集从左到右,从右到左
void test_PCA_mainAxis_AngleRange()
{
    // 构造点集
    double angle = 10;
    //int ang = 135;
    for (int ang = 0;ang < 365;ang += 5)
    {
        angle = ang;
        cv::Mat white(1000, 1000, CV_8UC3, Scalar(255, 255, 255));
        std::vector<cv::Point> pts;
        pts.clear();
        double vsin = sin(angle / 180.0 * 3.1415926);
        double vcos = cos(angle / 180.0 * 3.1415926);
        Point offset(300, 300);
        for (int i = 0;i < 200;i++)
        {

            int px = int(double(i) * vcos) + offset.x;
            int py = int(double(i) * vsin) + offset.y;

            Point pt(px, py);
            pts.push_back(pt);
            circle(white, pt, 3, Scalar(0, 0, 255), -1);
        }
        // 排序 
        std::sort(pts.begin(), pts.end(), [](Point& p1, Point& p2) {
            return p1.x < p2.x;
            });

        // 计算pca 角度
        double pac_angle = calLineOrientationInDegree(pts);
        cv::putText(white, cv::format("%.1f", pac_angle), Point(30, 30), cv::FONT_HERSHEY_PLAIN, 2, Scalar(255, 0, 20), 2);

        // 从右向左
        std::sort(pts.begin(), pts.end(), [](Point& p1, Point& p2) {
            return p1.x > p2.x;
            });
        double pac_angle2 = calLineOrientationInDegree(pts);
        cv::putText(white, cv::format("%.1f", pac_angle2), Point(130, 30), cv::FONT_HERSHEY_PLAIN, 2, Scalar(25, 0, 220), 2);

        // show pts
        cv::imshow("xx", white);

        //cv::waitKey(0);
        while (1)
        {
            if (cv::waitKey(10) == 27)
            {
                cv::destroyAllWindows();
                break;
            }
        }
    }
}

 

标签:pca,主轴,int,double,opencv,PCA,pts,cv
From: https://www.cnblogs.com/hakula/p/18508571

相关文章

  • OpenCV(Alpha通道)
    目录1.Alpha通道的概念2.Alpha通道的存储方式3.Alpha通道的作用4.Alpha通道的加权合成公式5.Alpha通道的代码示例6.Alpha通道的注意事项Alpha通道是图像数据中的一个透明度通道,用于控制图像的透明效果。理解Alpha通道的工作原理和使用方式对图像处理尤其是叠加、合成等操......
  • opencv和ffmpeg是什么关系
    OpenCV和FFmpeg之间的关系主要体现在视频处理和编解码的应用场景中。OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉库,主要用于图像和视频处理。FFmpeg是一个用于处理多媒体数据(如音频、视频、字幕等)的开源软件项目。两者可以结合使用,其中FFmpeg作为OpenCV的......
  • 使用opencvjs提取图片中的红色印章
    首先看下效果:首先对于纯红色的印章提取,也就是通过提取红色的像素然后得到印章的结果,然后通过在红色的图像中寻找圆圈检测来进行圈定印章的位置源码位置:https://github.com/xxss0903/extractstamp第一步是提取红色内容functionextractStampWithColorToOpencvMat(img,......
  • OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
    本文来源公众号“OpenCV学堂”,仅用于学术分享,侵权删,干货满满。原文链接:YOLOv8实战|荧光显微镜细胞图像检测数据集地址该图像数据集是U2OS细胞高通量化学筛选的一部分,其中包含200种生物活性化合物的示例。治疗效果最初是使用细胞绘画测定(荧光显微镜)成像的。该数据集仅......
  • 深度学习Python停车场智能车牌识别系统opencv流量费用时间AI源码
    随着智能交通技术的发展,停车场智能车牌识别系统逐渐成为现代停车管理的重要工具。该系统利用深度学习和计算机视觉技术,实现对车辆车牌的自动检测与识别,从而提高停车场的管理效率和用户体验。系统架构与功能模块车牌检测:系统首先利用目标检测算法(如YOLO或FasterR-CNN)对停车......
  • 利用飞腾派进行OpenCV开发
    实验目标:完成飞腾平台OpenCV开发。实验大纲:Mat数据结构加载、显示、保存图像读写像素RGB图像分离彩色图转灰度图Mat数据结构Mat是一个类,由两个数据部分组成:矩阵头(大小,通道,数据类型等)和数据块(像素值)。创建示例如下:Matimg;//创建无初始化矩阵Matimg1(2,3,......
  • Python OpenCV图像复原
    文章目录一、理论背景二、去噪方法三、具体实现步骤四、模糊处理(可选)五、注意事项PythonOpenCV图像复原是一个涉及去除噪声、模糊等失真的过程,旨在恢复图像的原始质量。以下是一个详细的案例教程,包括理论背景和具体实现步骤。一、理论背景图像噪声:图像噪声是图......
  • 学习日记_241025_核主成分分析(KPCA)
    前言提醒:文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。相关链接:KPCA算法:从原理到Python代码实现全面解......
  • 【C#】搭建环境之CSharp+OpenCV
    在我们使用C#编程中,对图片处理时会用到OpenCV库,以及其他视觉厂商提供的封装库,这里因为OpenCV是开源库,所以在VS资源里可以直接安装使用,这里简单说明一下搭建的步骤及实现效果,留存。1.项目创建1.1创建Windows应用窗体打开vs2022程序,我电脑安装的是这个版本,但对本次说明......
  • 20个基础到进阶版的OpenCV4.9.0趣味项目(C++版)(八)——石头、剪刀、布识别手势识别(传统方
    20个基础到进阶版的OpenCV4.9.0趣味项目(C++版)(八)——石头、剪刀、布识别手势识别(传统方法)文章目录20个基础到进阶版的OpenCV4.9.0趣味项目(C++版)(八)——石头、剪刀、布识别手势识别(传统方法)一、引言二、核心知识1.YCrCb空间转换和提取1)YCrCb色彩空间:2)分割:2.凸包凸包计算......