20、我们可以通过比较封闭轮廓中每个点到其他所有点的距离,来找出N个点的封闭轮廓中的极值点(即相距最远的两个点)。a. 这种算法的复杂度是多少?b. 解释如何能更快地完成这个任务。
a. 复杂度分析:对于一个包含N个点的封闭轮廓,要找出极值点,需要将每个点与其他所有点进行距离比较。对于第一个点,需要与剩下的N - 1个点比较;对于第二个点,由于已经和第一个点比较过了,所以只需与剩下的N - 2个点比较,以此类推。总的比较次数为(N - 1)+(N - 2)+…+1。根据等差数列求和公式,其和为N×(N - 1)/2。在大O表示法中,忽略常数和低阶项,该算法的复杂度为O(N²)。
b. 更快的实现方法:可以使用旋转卡壳算法(Rotating Calipers Algorithm)。该算法的基本思想是先找到点集的凸包,因为相距最远的两个点一定在凸包上。找到凸包的时间复杂度可以达到O(N log N)。然后,在凸包上使用旋转卡壳的方法来找到最远点对。旋转卡壳算法通过在凸包上设置两个“卡壳”,并不断旋转它们,在旋转过程中计算不同卡壳位置对应的点对之间的距离,从而找到最远点对。该算法在找到凸包之后,后续操作的时间复杂度为O(N)。因此,整体的时间复杂度主要由凸包的计算决定,为O(N log N),比直接比较每个点到其他所有点的距离的O(N²)复杂度要快。
21、在使用cv::moments()提取瓶子轮廓矩时,我们应该如何设置isBinary?解释你的答案。
在使用 cv::moments() 提取瓶子轮廓矩时, isBinary 应根据具体情况设置。
-
若输入的图像是经过阈值操作的二值图像,例如阈值操作后非零像素值为 255,此时应将
isBinary设置为true。
因为当isBinary为true时,所有非零像素将被视为值为 1,而不是存储在那里的实际值,这样可以确保正确计算轮廓矩,避免因非零像素的实际值影响计算结果。 -
若输入图像不是二值图像,而是普通图像,需要将图像值解释为“质量”,则应将
isBinary设置为false。
22、cv::goodFeaturesToTrack() 中使用的协方差Hessian矩阵是在该函数中由block_size设置的图像中的某个方形区域上计算得到的。a. 从概念上讲,当block_size增大时会发生什么?我们会得到更多还是更少的“好特征”?为什么?b. 深入研究lkdemo.cpp代码,查找cv::goodFeaturesToTrack(),并尝试调整block_size来观察差异。
a. 当 block_size 增大时,我们会得到更少的“好特征”。原因如下:
cv::goodFeaturesToTrack() 函数通过计算图像中每个像素点周围方形区域(由 block_size 确定)的协方差Hessian矩阵来寻找“好特征”。“好特征”通常是那些在多个方向上具有较大灰度变化的点,也就是图像中的角点。
当 block_size 增大时,计算协方差Hessian矩阵所考虑的区域变大,这意味着该区域内的灰度变化会被平均化。原本在较小区域内可能被识别为具有明显灰度变化的角点,在较大区域内可能由于周围像素的影响,其灰度变化不再那么突出,导致该点不再满足“好特征”的条件。
因此,随着 block_size 的增大,满足“好特征”定义的点会减少,即我们会得到更少的“好特征”。
b. 要完成这部分内容,需要按照以下步骤操作:
- 打开
lkdemo.cpp代码文件。 - 在代码中搜索
cv::goodFeaturesToTrack()函数。 - 找到该函数调用时设置
block_size参数的位置。 - 尝试修改
block_size的值,例如将其增大或减小。 - 重新编译并运行代码,观察结果的差异。
通常,当增大 block_size 时,会发现检测到的角点数量减少;当减小 block_size 时,检测到的角点数量可能会增加。同时,还可以观察角点的分布和质量的变化。
23、考虑实现亚像素角点查找的函数cv::findCornerSubPix()。a. 如果角点发生扭曲,使得直的明暗线形成在一点相交的曲线,亚像素角点查找是否仍然有效?请解释。b. 如果扩大扭曲棋盘角点周围的窗口大小(在扩大win和zero_zone参数之后),亚像素角点查找会变得更准确还是会开始发散?请解释你的答案。
a. 亚像素角点查找可能无法正常工作。 cv::findCornerSubPix() 这类亚像素角点检测技术通常基于角点周围的梯度信息和图像强度的变化来确定角点的精确位置。其基本假设是角点周围的区域具有相对规则的强度变化,例如直的明暗线。
当角点扭曲使得直的明暗线形成曲线时,原有的基于直线边缘的梯度计算和强度变化模型就不再适用。因为这些技术依赖于直线边缘的特征来进行插值和精确位置计算,曲线边缘会导致梯度方向和强度变化变得复杂,难以准确地通过现有的算法来确定角点的亚像素位置,所以亚像素角点查找可能无法得到准确的结果。
b. 亚像素角点查找可能会开始发散。扩大窗口大小意味着算法会考虑更多的图像区域来确定角点的位置。对于扭曲的棋盘角点,其周围的图像特征已经变得复杂和不规则。
当窗口扩大时,会包含更多不规则的曲线边缘和噪声信息,这些额外的信息可能会干扰算法对真正角点位置的判断。原有的基于规则边缘的亚像素定位算法在处理这些复杂信息时会

最低0.47元/天 解锁文章
10万+

被折叠的 条评论
为什么被折叠?



