基于opencv的HSV颜色提取、PCA计算轮廓方向、gabor滤波器函数使用

该博客介绍了如何使用OpenCV进行HSV颜色阈值提取,通过inRange函数划定HSV三通道的阈值范围,获取目标颜色的mask。同时,文章还展示了如何利用PCA计算轮廓的主方向,找出轮廓直线的斜率和经过的一点,以及如何绘制主方向。此外,还提到了Gabor滤波器在图像处理中的应用,通过filter2D函数对图像进行滤波操作。
摘要由CSDN通过智能技术生成

使用opencv进行HSV颜色提取

//输入原图,得到HSV阈值判断后图像
void matchFun::getHSV_black(const Mat image ,Mat& hsvMask)
{
    Mat orginimage = image.clone();
    Mat hsvImage;
    vector<Mat> hsvChannel;
    cvtColor(orginimage, hsvImage, CV_BGR2HSV);
    split(hsvImage, hsvChannel);
    Mat hueMask,saturationMask ,valueMask;

    //对HSV三通道进行阈值划定,得到固定颜色的mask   在阈值范围内就是255 白,不在就是0 黑
    inRange(hsvChannel[0],0,180,hueMask);
    inRange(hsvChannel[1],0, 70, saturationMask);//
    inRange(hsvChannel[2],0,255,valueMask);
    hsvMask = (hueMask & saturationMask) & valueMask;

}

基于opencv使用pca计算轮廓主方向

            //pca分析,求出斜率和经过的一点
            cv::Mat data_pts=cv::Mat(contours_out.at(index).size(),2,CV_64FC1);
            for (int i = 0; i < data_pts.rows; i++)
            {
                data_pts.at<double>(i,0) = contours_out.at(index).at(i).x;
                data_pts.at<double>(i,1) = contours_out.at(index).at(i).y;
            }
            cv::PCA pca_analysis(data_pts,cv::Mat(),CV_PCA_DATA_AS_ROW);
             //主方向直线经过的一点
            cv::Point pos=cv::Point2f(pca_analysis.mean.at<double>(0,0), pca_analysis.mean.at<double>(0,1));
            std::vector<cv::Point2d> eigen_vecs(2);    //保存PCA分析结果,其中0组为主方向,1组为垂直方向
            std::vector<double> eigen_val(2);   //特征值
            for (int i = 0; i < 2; ++i)
            {
                eigen_vecs[i] = cv::Point2d(pca_analysis.eigenvectors.at<double>(i, 0),
                    pca_analysis.eigenvectors.at<double>(i, 1));
                eigen_val[i] = pca_analysis.eigenvalues.at<double>(i,0);
            }
            // cv::line(drawcon, pos -  cv::Point(eigen_vecs[0].x * eigen_val[0],eigen_vecs[0].y * eigen_val[0]),
            //                 pos+ cv::Point(eigen_vecs[0].x * eigen_val[0],eigen_vecs[0].y * eigen_val[0]) , cv::Scalar(255, 255, 0));//绘制概略主方向
            // cv::imshow("1.jpg",drawcon);
            // cv::waitKey(0);
            //求出的特征向量就是单位方向向量
            //根据一点和方向向量计算直线方程 V_2 *x - V_1 * y+ V_1 * y0 - V_2 * x0 = 0
            A=B=C=0;
            A=eigen_vecs[0].y;
            B=- eigen_vecs[0].x;
            C=  eigen_vecs[0].x * pos.y - eigen_vecs[0].y * pos.x;
            //按照轮廓点与直线交点距离由进到远排序
            sort(contours_out.at(index).begin(),contours_out.at(index).end(),comp);

基于opencv使用gabor滤波器

  cv::Mat kernel=cv::getGaborKernel(cv::Size(3,3),3,90*3.14/180.0,8,0.5);
  cv::filter2D(adaptiveMask,adaptiveMask,-1,kernel);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值