logo资料库

python利用opencv进行相机标定(教程).pdf

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
实现步骤
拍摄棋盘图
寻找棋盘图并且标定+检视标定后结果
利用opencv寻找棋盘
标定
畸变矫正
畸变到非畸变
反向投影误差
主要代码
效果对比
今 天 的 低 价 单 孔 摄 像 机 ( 照 相 机 ) 会 给 图 像 带 来 很 多 畸 变 。 畸 变 主 要 有 两 种 : 径 向 畸 变 和 切 想 畸 变 。 如 下 图 所 ⽰ , ⽤ 红 ⾊ 直 线 将 棋 盘 的 两 个 边 标 注 出 来 , 但 是 你 会 发 现 棋 盘 的 边 界 并 不 和 红 线 重 合 。 所 有 我 们 认 为 应 该 是 直 线 的 也 都 凸 出 来 了 。 在 3 D 相 关 应 ⽤ 中 , 必 须 要 先 校 正 这 些 畸 变 。 为 了 找 到 这 些 纠 正 参 数 , 我 们 必 须 要 提 供 ⼀ 些 包 含 明 显 图 案 模 式 的 样 本 图 ⽚ ( ⽐ 如 说 棋 盘 ) 。 我 们 可 以 在 上 ⾯ 找 到 ⼀ 些 特 殊 点 ( 如 棋 盘 的 四 个 ⻆ 点 ) 。 我 们 起 到 这 些 特 殊 点 在 图 ⽚ 中 的 位 置 以 及 它 们 的 真 是 位 置 。 有 了 这 些 信 息 , 我 们 就 可 以 使 ⽤ 数 学 ⽅ 法 求 解 畸 变 系 数 。 这 就 是 整 个 故 事 的 摘 要 了 。 为 了 得 到 更 好 的 结 果 , 我 们 ⾄ 少 需 要 1 0 个 这 样 的 图 案 模 式 。 实 现 步 骤 拍 摄 棋 盘 图 ⾸ 先 打 印 下 图 : 下 载 也 可 直 接 保 存
将 其 固 定 到 ⼀ 个 平 ⾯ 上 , 使 ⽤ 相 机 从 不 同 ⻆ 度 , 不 同 位 置 拍 摄 ( 1 0 - 2 0 ) 张 标 定 图 。 类 似 这 样 的 : p y t h o n 调 ⽤ o p e n c v 相 机 拍 照 代 码 ( 例 ) : i m p o r t c v c a m e r a = c v . V i d e o C a p t u r e ( 0 ) i = 0 w h i l e 1 : ( g r a b b e d , i m g ) = c a m e r a . r e a d ( ) c v . i m s h o w ( ' i m g ' , i m g ) i f c v . w a i t K e y ( 1 ) & x F F = = o r d ( ' j ' ) : # 按 j 保 存 ⼀ 张 图 ⽚ i + = 1 u = s t r ( i ) fi r e n a m e = s t r ( ' . / i m g ' + u + ' . j p g ' ) c v . i m w r i t e ( fi r e n a m e , i m g )
按 j 拍 摄 图 ⽚ , 将 会 按 照 顺 序 批 量 保 存 , 按 q 退 出 程 序 。 寻 找 棋 盘 图 并 且 标 定 + 检 视 标 定 后 结 果 利 ⽤ o p e n c v 寻 找 棋 盘 为 了 找 到 棋 盘 的 图 案 , 我 们 要 使 ⽤ 函 数 c v 2 . fi n d C h e s s b o a r d C o r n e r s ( ) 。 我 们 还 需 要 传 ⼊ 图 案 的 类 型 , ⽐ 如 说 8 x 8 的 格 ⼦ 或 5 x 5 的 格 ⼦ 等 。 在 本 例 中 我 们 使 ⽤ 的 9 × 6 的 格 ⼦ 。 ( 通 常 情 况 下 棋 盘 都 是 8 x 8 或 者 7 x 7 ) 。 它 会 返 回 ⻆ 点 , 如 果 得 到 图 像 的 话 返 回 值 类 型 ( R e t v a l ) 就 会 是 T r u e 。 这 些 ⻆ 点 会 按 顺 序 排 列 ( 从 左 到 右 , 从 上 到 下 ) 这 个 函 数 可 能 不 会 找 出 所 有 图 像 中 应 有 的 图 案 。 所 以 ⼀ 个 好 的 ⽅ 法 是 编 写 代 码 , 启 动 摄 像 机 并 在 每 ⼀ 帧 中 检 查 是 否 有 应 有 的 图 案 。 在 我 们 获 得 图 案 之 后 我 们 要 找 到 ⻆ 点 并 把 它 们 保 存 成 ⼀ 个 列 表 。 在 读 取 下 ⼀ 帧 图 像 之 前 要 设 置 ⼀ 定 的 间 隔 , 这 样 我 们 就 有 ⾜ 够 的 时 间 调 整 棋 盘 的 ⽅ 向 。 继 续 这 个 过 程 直 到 我 们 得 到 ⾜ 够 多 好 的 图 案 。 就 算 是 我 们 举 得 这 个 例 ⼦ , 在 所 有 的 1 4 幅 图 像 中 也 不 知 道 有 ⼏ 幅 是 好 的 。 所 以 我 们 要 读 取 每 ⼀ 张 图 像 从 其 中 找 到 好 的 能 ⽤ 的 。 除 了 使 ⽤ 棋 盘 之 外 , 我 们 还 可 以 使 ⽤ 环 形 格 ⼦ , 但 是 要 使 ⽤ 函 数 c v 2 . fi n d C i r c l e s G r i d ( ) 来 找 图 案 。 据 说 使 ⽤ 环 形 格 ⼦ 只 需 要 很 少 的 图 像 就 可 以 了 。 在 找 到 这 些 ⻆ 点 之 后 我 们 可 以 使 ⽤ 函 数 c v 2 . c o r n e r S u b P i x ( ) 增 加 准 确 度 。 我 们 使 ⽤ 函 数 c v 2 . d r a w C h e s s b o a r d C o r n e r s ( ) 绘 制 图 案 。 所 有 的 这 些 步 骤 都 被 包 含 在 下 ⾯ 的 代 码 中 了 : p r i n t ( ' 写 ⼊ : ' , fi r e n a m e ) i f c v . w a i t K e y ( 1 ) & x F F = = o r d ( ' q ' ) : b r e a k
标 定 在 得 到 了 这 些 对 象 点 和 图 像 点 之 后 , 我 们 已 经 准 备 好 来 做 摄 像 机 标 定 了 。 我 们 要 使 ⽤ 的 函 数 是 c v 2 . c a l i b r a t e C a m e r a ( ) 。 它 会 返 回 摄 像 机 矩 阵 , 畸 变 系 数 , 旋 转 和 变 换 向 量 等 。 畸 变 矫 正 现 在 我 们 找 到 我 们 想 要 的 东 西 了 , 我 们 可 以 找 到 ⼀ 幅 图 像 来 对 他 进 ⾏ 校 正 了 。 O p e n C V 提 供 了 两 种 ⽅ 法 , 我 们 都 学 习 ⼀ 下 。 不 过 在 那 之 前 我 们 可 以 使 ⽤ 从 函 数 c v 2 . g e t O p t i m a l N e w C a m e r a M a t r i x ( ) 得 到 的 ⾃ 由 缩 放 系 数 对 摄 像 机 矩 阵 进 ⾏ 优 化 。 如 果 缩 放 系 数 a l p h a = 0 , 返 回 的 ⾮ 畸 变 图 像 会 带 有 最 少 量 的 不 想 要 的 像 素 。 它 甚 ⾄ 有 可 能 在 图 像 ⻆ 点 去 除 ⼀ 些 像 素 。 如 果 a l p h a = 1 , 所 有 的 像 素 都 会 被 返 回 , 还 有 ⼀ 些 ⿊ 图 像 。 它 还 会 返 回 ⼀ 个 R O I 图 像 , 我 们 可 以 ⽤ 来 对 结 果 进 ⾏ 裁 剪 。 函 数 : c v 2 . g e t O p t i m a l N e w C a m e r a M a t r i x ( m t x , d i s t , ( w , h ) , 1 , ( w , h ) ) 中 参 数 1 是 个 坑 , 官 ⽅ ⽂ 档 给 的 参 数 是 1 但 是 标 定 后 的 结 果 是 ⼀ 个 球 形 的 视 ⻆ , 我 查 了 好 久 资 料 最 后 咨 询 了 ⼤ 佬 才 发 现 这 个 坑 这 ⾥ 我 们 使 ⽤ c v 2 . g e t O p t i m a l N e w C a m e r a M a t r i x ( m t x , d i s t , ( w , h ) , 0 , ( w , h ) ) 参 数 设 置 为 0 畸 变 到 ⾮ 畸 变 下 ⾯ 代 码 中 d s t 1 图 像 使 ⽤ 的 是 c v 2 . u n d i s t o r t ( ) 这 是 最 简 单 的 ⽅ 法 。 只 需 使 ⽤ 这 个 函 数 和 上 边 得 到 的 R O I 对 结 果 进 ⾏ 裁 剪 d s t 2 图 像 使 ⽤ 的 是 r e m a p p i n g 这 应 该 属 于 “ 曲 线 救 国 ” 了 。 ⾸ 先 我 们 要 找 到 从 畸 变 图 像 到 ⾮ 畸 变 图 像 的 映 射 ⽅ 程 。 再 使 ⽤ 重 映 射 ⽅ 程 。 ( 代 码 中 有 详 细 ⽤ 法 ) 两 种 效 果 可 以 ⾃ ⾏ 对 ⽐ 看 看 纠 正 前 后 对 ⽐ :
反 向 投 影 误 差 我 们 可 以 利 ⽤ 反 向 投 影 误 差 对 我 们 找 到 的 参 数 的 准 确 性 进 ⾏ 估 计 。 得 到 的 结 果 越 接 近 0 越 好 。 有 了 内 部 参 数 , 畸 变 参 数 和 旋 转 变 换 矩 阵 , 我 们 就 可 以 使 ⽤ c v 2 . p r o j e c t P o i n t s ( ) 将 对 象 点 转 换 到 图 像 点 。 然 后 就 可 以 计 算 变 换 得 到 图 像 与 ⻆ 点 检 测 算 法 的 绝 对 差 了 。 然 后 我 们 计 算 所 有 标 定 图 像 的 误 差 平 均 值 。 ( 但 是 本 ⽂ 不 需 要 , 所 以 没 有 将 其 写 ⼊ ) 主 要 代 码 需 要 的 库 : o p e n c v - p y t h o n n u m p y g l o b i m p o r t c v i m p o r t n u m p y a s n p i m p o r t g l o b # 找 棋 盘 格 ⻆ 点 # 设 置 寻 找 亚 像 素 ⻆ 点 的 参 数 , 采 ⽤ 的 停 ⽌ 准 则 是 最 ⼤ 循 环 次 数 3 0 和 最 ⼤ 误 差 容 限 0 . 0 0 1 c r i t e r i a = ( c v . T E R M _ C R I T E R I A _ E P S + c v . T E R M _ C R I T E R I A _ M A X _ I T E R , 3 0 , 0 . 0 0 1 ) # 阈 值 # 棋 盘 格 模 板 规 格 w = 9 # 1 0 - 1 h = 6 # 7 - 1 # 世 界 坐 标 系 中 的 棋 盘 格 点 , 例 如 ( 0 , 0 , 0 ) , ( 1 , 0 , 0 ) , ( 2 , 0 , 0 ) . . . . , ( 8 , 5 , 0 ) , 去 掉 Z 坐 标 , 记 为 ⼆ 维 矩 阵 o b j p = n p . z e r o s ( ( w * h , 3 ) , n p . fl o a t ) o b j p [ : , : 2 ] = n p . m g r i d [ 0 : w , 0 : h ] . T . r e s h a p e ( - 1 , 2 ) o b j p = o b j p * 1 8 . 1 # 1 8 . 1 m m # 储 存 棋 盘 格 ⻆ 点 的 世 界 坐 标 和 图 像 坐 标 对 o b j p o i n t s = [ ] # 在 世 界 坐 标 系 中 的 三 维 点 i m g p o i n t s = [ ] # 在 图 像 平 ⾯ 的 ⼆ 维 点 # 加 载 p i c ⽂ 件 夹 下 所 有 的 j p g 图 像 i m a g e s = g l o b . g l o b ( ' . / * . j p g ' ) # 拍 摄 的 ⼗ ⼏ 张 棋 盘 图 ⽚ 所 在 ⽬ 录 i = 0 f o r f n a m e i n i m a g e s : i m g = c v . i m r e a d ( f n a m e ) # 获 取 画 ⾯ 中 ⼼ 点 # 获 取 图 像 的 ⻓ 宽 h , w = i m g . s h a p e [ 0 ] , i m g . s h a p e [ 1 ] g r a y = c v . c v t C o l o r ( i m g , c v . C O L O R _ B G R G R A Y ) u , v = i m g . s h a p e [ : 2 ] # 找 到 棋 盘 格 ⻆ 点 r e t , c o r n e r s = c v . fi n d C h e s s b o a r d C o r n e r s ( g r a y , ( w , h ) , N o n e ) # 如 果 找 到 ⾜ 够 点 对 , 将 其 存 储 起 来 i f r e t = = T r u e : p r i n t ( " i : " , i ) i = i + 1 # 在 原 ⻆ 点 的 基 础 上 寻 找 亚 像 素 ⻆ 点 c v . c o r n e r S u b P i x ( g r a y , c o r n e r s , ( 1 1 , 1 1 ) , ( - 1 , - 1 ) , c r i t e r i a ) # 追 加 进 ⼊ 世 界 三 维 点 和 平 ⾯ ⼆ 维 点 中 o b j p o i n t s . a p p e n d ( o b j p ) i m g p o i n t s . a p p e n d ( c o r n e r s )
代 码 放 到 图 ⽚ 相 同 的 ⽂ 件 夹 直 接 运 ⾏ 即 可 效 果 对 ⽐ 纠 正 前 后 : # 将 ⻆ 点 在 图 像 上 显 ⽰ c v . d r a w C h e s s b o a r d C o r n e r s ( i m g , ( w , h ) , c o r n e r s , r e t ) c v . n a m e d W i n d o w ( ' fi n d C o r n e r s ' , c v . W I N D O W _ N O R M A L ) c v . r e s i z e W i n d o w ( ' fi n d C o r n e r s ' , 6 4 0 , 4 8 0 ) c v . i m s h o w ( ' fi n d C o r n e r s ' , i m g ) c v . w a i t K e y ( 2 0 0 ) c v . d e s t r o y A l l W i n d o w s ( ) # % % 标 定 p r i n t ( ' 正 在 计 算 ' ) # 标 定 r e t , m t x , d i s t , r v e c s , t v e c s = \ c v . c a l i b r a t e C a m e r a ( o b j p o i n t s , i m g p o i n t s , g r a y . s h a p e [ : : - 1 ] , N o n e , N o n e ) p r i n t ( " r e t : " , r e t ) p r i n t ( " m t x : \ n " , m t x ) # 内 参 数 矩 阵 p r i n t ( " d i s t 畸 变 值 : \ n " , d i s t ) # 畸 变 系 数 d i s t o r t i o n c o ffi c i e n t s = ( k _ , k _ , p _ , p _ , k _ ) p r i n t ( " r v e c s 旋 转 ( 向 量 ) 外 参 : \ n " , r v e c s ) # 旋 转 向 量 # 外 参 数 p r i n t ( " t v e c s 平 移 ( 向 量 ) 外 参 : \ n " , t v e c s ) # 平 移 向 量 # 外 参 数 n e w c a m e r a m t x , r o i = c v . g e t O p t i m a l N e w C a m e r a M a t r i x ( m t x , d i s t , ( u , v ) , 0 , ( u , v ) ) p r i n t ( ' n e w c a m e r a m t x 外 参 ' , n e w c a m e r a m t x ) # 打 开 摄 像 机 c a m e r a = c v . V i d e o C a p t u r e ( 0 ) w h i l e T r u e : ( g r a b b e d , f r a m e ) = c a m e r a . r e a d ( ) h , w = f r a m e . s h a p e [ : 2 ] n e w c a m e r a m t x , r o i = c v . g e t O p t i m a l N e w C a m e r a M a t r i x ( m t x , d i s t , ( u , v ) , 0 , ( u , v ) ) # 纠 正 畸 变 d s t = c v . u n d i s t o r t ( f r a m e , m t x , d i s t , N o n e , n e w c a m e r a m t x ) # d s t = c v . u n d i s t o r t ( f r a m e , m t x , d i s t , N o n e , n e w c a m e r a m t x ) m a p x , m a p y = c v . i n i t U n d i s t o r t R e c t i f y M a p ( m t x , d i s t , N o n e , n e w c a m e r a m t x , ( w , h ) , 5 ) d s t = c v . r e m a p ( f r a m e , m a p x , m a p y , c v . I N T E R _ L I N E A R ) # 裁 剪 图 像 , 输 出 纠 正 畸 变 以 后 的 图 ⽚ x , y , w , h = r o i d s t = d s t [ y : y + h , x : x + w ] # c v . i m s h o w ( ' f r a m e ' , d s t ) # c v . i m s h o w ( ' d s t ' , d s t ) c v . i m s h o w ( ' d s t ' , d s t ) i f c v . w a i t K e y ( 1 ) & x F F = = o r d ( ' q ' ) : # 按 q 保 存 ⼀ 张 图 ⽚ c v . i m w r i t e ( " . . / u / f r a m e . j p g " , d s t ) b r e a k c a m e r a . r e l e a s e ( ) c v . d e s t r o y A l l W i n d o w s ( )
分享到:
收藏