资源简介
基于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
- 上一篇:arcgis 矿产资源符号库
- 下一篇:经典去噪算法小波、Lee等等
评论
共有 条评论