# aruco 参数分析

aruco.cpp
在287行有一个DetectInitialCandidatesParallel
在这里面有并行操作，用于对图像进行二值化，之后检测二值化后的图像中是否存在marker。

其循环次数直接和adaptiveThreshWinSizeMin adaptiveThreshWinSizeMax adaptiveThreshWinSizeStep相关。默认情况下分别是3 23 10，也就是会循环三次分别用3 13 23的二值化系数，其中数字越大，二值化以后的边缘越粗。实测认为23太大，循环为为3 6 9 即可。
至于adaptiveThreshConstant暂时觉得没有什么贡献，这个数值越高，二值化以后的图中孤立的噪声点越少，默认是7，可调为20。
adaptiveThreshWinSize参数没有用到，删了。

函数传入了Range就是adaptiveThreshWinSizeMin adaptiveThreshWinSizeMax 之间循环的次数。

minMarkerPerimeterRate是限制了图像中marker的最小边长尺寸，将这个修改为0.5会发现很多小的marker检测不出来。

程序通过findContours查找闭合边缘，然后先
根据min/maxMarkerPerimeterRate挑选出适合长度的区域

检查矩形以及凸型 使用approxPolyDP函数 输入一组点，输出该该点集的拟合图形，其中拟合偏差度由accuracyRate决定，其越小，拟合的越精确。默认是0.05，如果改为0.01则找出的区域在边角跳动很剧烈，因为阈值太严格，每张图像多多少少有噪声，这些噪声会直接影响结果。所以保持默认的0.05.
通过检查拟合出来的点集的size是否为4来筛选出矩形。通过isContourConvex来判断是否是凸集。

minCornerDistance没有用，取代的是minCornerDistanceRate。他表示approxPolyDP输出的四个点，两两之间计算图像上的距离，寻找最小的那个距离，之后这个距离必须大于findContours找到的闭合边缘的百分比，理所应当的是这个参数要小于0.25，默认是0.05，我改为0.15可以消除很多斜视的情况！

minDistanceToBorder是值找出来的图形距离图像边缘的阈值，默认是3，其实和adaptiveThreshWinSizeMin 有关，这里就用默认值3

至此_detectInitialCandidates函数任务完成。输出了一批候选marker

之后是 _identifyCandidates 要计算出marker的id号。
markerBorderBits在生成marker是就决定了，这里是1

之后是_filterTooCloseCandidates，将特别靠近的marker去除掉。minMarkerDistance参数没有用删除，minMarkerDistanceRate保持默认值。

doCornerRefinement是使用亚像素级角点检测，可以不使用。

至此检测所有的marker结束之后就是位姿估计。



```sh
export ANDROID_SDK=
export PATH=$ANDROID_SDK/tools:$PATH
source  ~/.bashrc

```



```python
# 图像二值化
def threshold(self):
    src = self.cv_read_img(self.src_file)
    if src is None:
        return
 
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
 
    # 这个函数的第一个参数就是原图像，原图像应该是灰度图。
    # 第二个参数就是用来对像素值进行分类的阈值。
    # 第三个参数就是当像素值高于（有时是小于）阈值时应该被赋予的新的像素值
    # 第四个参数来决定阈值方法，见threshold_simple()
    # ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
    ret, dst = cv.threshold(gray, 127, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    self.decode_and_show_dst(dst)
```

