Opencv(二)形状识别

识别形状

有九个图案和最外面的正方形轮廓,识别出10个轮廓形状和每个轮廓的重心坐标。
这里写图片描述

#include<opencv2/opencv.hpp>
#include<opencv2\legacy\legacy.hpp>
#include<vector>
#include<iostream>
double angle(cv::Point pt1, cv::Point pt2, cv::Point pt0) //求角度
{
    double dx1 = pt1.x - pt0.x;
    double dy1 = pt1.y - pt0.y;
    double dx2 = pt2.x - pt0.x;
    double dy2 = pt2.y - pt0.y;
    return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}
int main()
{
    cv::Mat srcImg, tempImg,gary,thresh,srcImg1;
    cv::Mat dstImg; 
    int j = 0;
    double s = 0;
    srcImg = cv::imread("90.bmp");
    if (!srcImg.data)
    {
        std::cout << "no img" << std::endl;
        return -1;
    }
    //图片处理
    resize(srcImg, srcImg, cv::Size(srcImg.cols / 2, srcImg.rows / 2), 0, 0);//缩放
    cvtColor(srcImg, gary, CV_RGB2GRAY);//灰度图
    medianBlur(gary, gary, 3);//中值滤波
    threshold(gary, thresh, 0, 255, cv::THRESH_OTSU);//二值化
    srcImg1 = thresh.clone();
    dstImg = cv::Mat(srcImg.size(), CV_8UC3, cv::Scalar(255, 255, 255));
    //寻找轮廓
    std::vector<std::vector<cv::Point>>contours;
    findContours(srcImg1, contours, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
    std::vector<cv::Point>approx;
    //圆
    std::vector<cv::Vec3f>circles;
    HoughCircles(gary, circles, CV_HOUGH_GRADIENT, 1, srcImg.rows / 2, 100, 60, 0, 0);//单通道
    for (size_t i = 0; i < circles.size(); i++)
    {
        cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circle(dstImg, center, radius, cv::Scalar(0, 255, 0), 5, 8, 0);
        circle(dstImg, center, 3, cv::Scalar(0, 255, 0), -1);
        std::cout << "圆心" << i + 1 << center << std::endl;
    }
    //菱形
    std::vector<cv::Point>squares;
    //长方形
    std::vector<cv::Point>changfang;
    //正方形
    std::vector<cv::Point>zhengfang;
    //三角形
    std::vector<cv::Point>sanjiao;
    //五角星
    std::vector<cv::Point>wujiao;
    //五边形
    std::vector<cv::Point>wubian;
    //十字形
    std::vector<cv::Point>shizi;
    //梅花形
    std::vector<cv::Point>meihua;
    //画四边形
    double t;
    for (size_t i = 0; i < contours.size(); i++)
    {
        drawContours(dstImg, contours, i, cv::Scalar(100, 100, 100), 3);
        approxPolyDP(contours[i], approx, arcLength(cv::Mat(contours[i]), true)*0.02, true);
        if (approx.size() == 4 && fabs(contourArea(cv::Mat(approx))) > 
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android OpenCV形状识别是通过使用OpenCV库来对从摄像头获取到的图片进行处理和分析,以识别出图片中的不同形状。该项目主要包括以下步骤: 1. 提取屏幕矩形区域:通过摄像头获取图片,并提取出感兴趣的矩形区域,减少后续处理的范围。 2. HSV颜色空间分割:将图片转换到HSV颜色空间,并根据颜色的不同,将图像分割为不同的区域。 3. 形状判断:通过计算图像中各个区域的角点数目来判断形状,例如四个角表示矩形,三个角表示三角形等。 然而,在实际开发过程中,可能会遇到一些难点。其中包括: 1. 摄像头获取的图片可能不够清晰,分辨率低,对比度和饱和度也可能较低。这需要调节摄像头参数来改善图片质量。 2. 菱形和矩形之间的区别可能不太明显,需要根据外界矩形和面积比来进行区分。 3. 不同底色的图片可能需要采用不同的识别方法,比如黑白底色的图片可能不能使用HSV颜色分割。 以上是Android OpenCV形状识别的一般流程和一些可能遇到的难点。通过对摄像头获取的图片进行处理和分析,该项目可以识别出图片中的不同形状。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android+Opencv图形的形状颜色识别](https://blog.csdn.net/chenyouledashen/article/details/118067143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值