• 大小: 1.38MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-09-21
  • 语言: 其他
  • 标签: 标记点  圆形检测  

资源简介

基于opencv实现的,圆形环状标记点识别与检测。 内含源码,论文和标记点图样。 标记点样式是自己定义的,识别逻辑只适用于此标记点。 此代码基于opencv3.3实现,其他版本未测试。 依赖库:opencv_core opencv_imgcodecs opencv_highgui opencv_imgproc

资源截图

代码片段和文件信息

#include 

#include 

#include 


#include “utils.h“

#define SHOW_PIC


int FindChild(std::vector& hierarchy int nId)
{
    if(nId < 0)
        return 0;

    int nChildId = hierarchy[nId][2];

    int nCount = 0;
    while (nChildId != -1)
    {
        nCount += FindChild(hierarchy nChildId);
        nCount++;
        nChildId = hierarchy[nChildId][0];
    }

    return nCount;
}

struct MyMarkPoint
{
    std::vector m_vecContours;
    std::vector> m_vecChildContours;

    int m_nNum = 0;
    std::vector m_vecBinIndex;
};

int main()
{
    cv::Mat src src_graysrc_bf;
    std::string strFileName = “./0.jpg“;
    src = cv::imread(strFileName 1 );


    cv::cvtColor( src src_gray CV_BGR2GRAY );

    cv::bilateralFilter(src_gray src_bf 5 5050);
    src_gray = src_bf;

    cv::threshold(src_gray src_gray 0 255 CV_THRESH_OTSU/*|CV_THRESH_BINARY_INV*/);

    std::vector > contours;
    std::vector hierarchy;
    cv::findContours(src_gray contours hierarchy CV_RETR_TREE CV_CHAIN_APPROX_NONE);
{
#ifdef SHOW_PIC
    src_gray = cv::Scalar::all(0);
    cv::drawContours(src_gray contours -1 cv::Scalar(25500));
    cv::imwrite(strFileName+“_Contours.jpg“ src_gray);
#endif}

    std::map > cornersIndex;
    std::vector< std::vector > cornerslist;
    for (unsigned int i = 0; i < contours.size(); i++)
    {
        std::vector corners;
        double area = cv::contourArea(contours[i]);


        cv::approxPolyDP(contours[i] corners sqrt(area)*0.12 true);


        if(cv::isContourConvex(corners)
                && corners.size() ==8
                //还需要更多条件限制 参考论文
                )
        {
            //查找子结点的个数
            int nChild = hierarchy[i][2];

            std::vector Childlist;

            while (nChild != -1)
            {
                Childlist.push_back(nChild);
                nChild = hierarchy[nChild][0];
            }

            if(Childlist.size() > 4 && Childlist.size() < 12)
            {
                cornerslist.push_back(corners);
                cornersIndex.insert(std::make_pair(i Childlist));
            }
        }

    }


    std::map< int int > marklist;

    auto it = cornersIndex.begin();
    while (it != cornersIndex.end())
    {
        std::vector ptlist;

        int nIndex = it->first;
        //拟合椭圆
        cv::RotatedRect rs = cv::fitEllipse(contours[nIndex]);

{
#ifdef SHOW_PIC
        cv::ellipse(src rs cv::Scalar(02550)  1 cv::LINE_AA);
#endif}


        //仿射变换成单位圆
        Ellipse2Circle(contours[nIndex] rs);
        cv::Point2f ptC = GetCenter(contours[nIndex]);

        ptlist.push_back(ptC);

        {
#ifdef SHOW_PIC
        cv::circle(src ptC 2 cv::Scalar(25500) 1 8);
#endif}

        //子节点变换
        std::vector& child = it->second;
        for(auto index:child)
        

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-07-25 14:24  mark\
     文件      232379  2018-07-24 11:08  mark\111.jpg
     文件      709922  2018-07-18 16:31  mark\eb2951511437d84e76b0a66960be5f8f324c.pdf
     文件        4166  2018-07-24 16:50  mark\main (copy).cpp
     文件      314837  2018-07-25 14:21  mark\mark.jpg
     文件     1899727  2018-07-25 14:21  mark\mark.psd
     文件      174734  2018-07-19 18:21  mark\test1.jpg
     文件      171816  2018-07-24 11:01  mark\test2.jpg
     文件      170230  2018-07-24 11:01  mark\test3.jpg
     文件      171799  2018-07-24 11:02  mark\test4.jpg
     文件      170335  2018-07-24 11:03  mark\test5.jpg
     文件        5822  2018-07-24 14:26  mark\utils (copy).h

评论

共有 条评论