opencv for rectangle image recognition

我决定启动这项在心中停留了好几年的想法。

辅助性的输出应当是:熟悉opencv的开发以及图像检索的各种算法的优劣。熟悉Python。熟悉Object-C的开发。

目标先不要定太高,先从一个有限的标准图片库进行检索开始:

  • 库里面有300~2000张长方形的彩色图片。
  • 检索的图片源来自互联网或者相机。
  • 待检索的图片中可能包含有长方形区域,匹配库中的某一图片(的主要区域,边缘部分有可能不一致,主要区域上可能被污损)。括号内的难度递增。
  • 待检索图片主要区域可能有色偏。
  • 待检索图片主要区域可能有沿曲面的变形。
  • 待检索图片主要区域可能有轻微的平面几何变形。
  • 检索结果可以包含一个小集合3~10个库内图片,并附带其匹配得分。

好了,说说编程和一些结果。

python好几年没用了,现在发现还是很方便的。

安装步骤:

  1. Download python installer.exe
  2. Install python(include pip)
  3. pip install –upgrade setuptools
  4. pip install numpy Matplotlib
  5. pip install opencv-python
  6. pip install时加上 -i https://pypi.tuna.tsinghua.edu.cn/simple,快很多,清华的源就是好

python编程基本靠search engine… 我是连注释方式都忘得差不多。

opencv编程也是,查cv版本:

python
>>import cv2
>>cv2.__version__

cv和cv2很多函数/常量也改名改得多,速查函数/常量名:
for option in cv2.__dict__:
if ‘KEYWORD’ in option:
print option

先来的是直方图,

计算直方图

cv2.calcHist,其中有个比较有效的参数是直方图分块,一般用256,但在存在色偏而不是太严重的时候,就不适宜用256了,目前根据这些图片的特点,改用4/5/6/7/8等会更好,当然了,根据需要用不同的分块数来计算直方图后再结合多个结果会更好。

直方图比较

cv2.compareHist,有好几种公式,我没想到对于色偏最好的是cv2.HISTCMP_INTERSECT,再结合3~10的直方图分块,效果比较理想。

目前所做的是全图片直方图比较。由于图片中央矩形的边沿存在很多不确定性,导致直方图在左右两端(近0和近255)差异较大,公式倾向于失效。必须进行图片的中央矩形提取。

下一步做中央矩形提取。