eye-tracking/notebooks/Finding page corners for se...

116 lines
6.1 MiB
Plaintext
Raw Permalink Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Finding corners, tested on several images\n",
"\n",
"\n",
"It turns out the cosine_threshold is quite tricky, maybe it should be searched for as the lowest or a reasonably low veresion such that exactly two lines are found per corner. Also, it might help to force overlap of two out ofthree points when clusting points that lie on one line.\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('..')\n",
"from pagelocalizer import find_corner_circles, cluster_circles_per_corner, intersection_per_corner, separate_lines, find_line_coefficients_per_corner\n",
"import numpy\n",
"import glob\n",
"import cv2\n",
"\n",
"%matplotlib inline\n",
"from matplotlib import pyplot, rcParams\n",
"\n",
"rcParams['figure.figsize'] = (20, 16)\n",
"rcParams['figure.dpi'] = '100'"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7f3e20d46b38>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<matplotlib.figure.Figure at 0x7f3e25fd78d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for filename in ['../images/img2.jpg', '../images/img4.jpg']:\n",
" im = cv2.imread(filename, cv2.IMREAD_COLOR)\n",
" pyplot.figure()\n",
" pyplot.imshow(im)\n",
" \n",
" keypoints = find_corner_circles(im,\n",
" area=(5000 / 4, 5000 * 4),\n",
" color=None,\n",
" convexity=0.9,\n",
" circularity=0.7,\n",
" inertia=None,\n",
" thresholdstep=1\n",
" )\n",
" keypoints, corner_circles = cluster_circles_per_corner(keypoints, distance_factor=1.5)\n",
" for corner in corner_circles:\n",
" pyplot.plot(*zip(*[keypoints[i].pt for i in corner]), 'o', markersize=12, fillstyle='none', markeredgewidth=2)\n",
" \n",
" lines_per_corner = find_line_coefficients_per_corner(\n",
" keypoints, corner_circles,\n",
" cosine_threshold=0.00137046524)\n",
" xx = numpy.arange(0, im.shape[1]-1,0.25)\n",
" for (a, b), (c, d) in lines_per_corner:\n",
" pyplot.plot(xx, a*xx + b, linewidth=4)\n",
" pyplot.plot(xx, c*xx + d, linewidth=4)\n",
" \n",
" corners, order = intersection_per_corner(lines_per_corner)\n",
" polygon_corners = numpy.array([corners[i] for i in order] + [corners[order[0]]])\n",
"\n",
" pyplot.plot(*polygon_corners.T, 'r-', linewidth=4)\n",
" pyplot.imshow(im)\n",
" pyplot.axis('off')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}