"la focale est de 30.50 mm et l'ouverture de 1/ 1.80\n",
"angle du champ de vue 10.58° pour une focale de 30.50 mm,\n",
"on considere un cercle de confusion de 1.0 pixel(s) capteur\n",
"Cas hyperfocale : si mise au point à 274.41 m, on est net entre 137.21m et l'infini\n"
]
}
],
"source": [
"c=1*taillePixel[0]/1000 # diametre du cercle de confusion en mm , j'ai mis la taille d'un pixel (à vérifier que c'est judicieux)\n",
"H=f**2/N/c/1000 #en m, distance hyperfocale\n",
"print(name)\n",
"print(f\"la focale est de {f:.2f} mm et l'ouverture de 1/ {N:.2f}\")\n",
"print(f\"angle du champ de vue {champVue:.2f}° pour une focale de {f:.2f} mm,\") \n",
"print(f\"on considere un cercle de confusion de {c*1000/taillePixel[0]:.1f} pixel(s) capteur\")\n",
"print(f\"Cas hyperfocale : si mise au point à {H:.2f} m, on est net entre {H/2:.2f}m et l'infini\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"PowerShotG5\n",
"à 300 m, on a dépassé l'hyperfocale\n",
"à 300 m, le champ de vue (10.58°) forme une zone de 55.6 m\n",
"un pixel représente alors 1.9 cm\n"
]
}
],
"source": [
"# parametres arbre\n",
"p=300 # distance (en m) à laquelle se trouve l'objet en m (mise au point)\n",
"\n",
"print(name)\n",
"#zone de netteté\n",
"p1=p*H/(p+H) # debut de zone de netteté\n",
"p2=p*H/(H-p) # fin de zone de netteté\n",
"if p<H:\n",
" print(f\"si mise au point à {p:.2f} m, on est net entre {p1:.2f} m et {p2:.2f} m\")\n",
"else:\n",
" print(f\"à {p} m, on a dépassé l'hyperfocale\")\n",
" p1=H/2\n",
" p2=float('inf') \n",
"\n",
"#resolution\n",
"dx=2*p*np.tan(np.pi*champVue/2/180) # en m, zone vue par le champ de vue\n",
"dcapteur=dx/np.min(nbPixel)*100 # en cm, taille réelle d'un pixel\n",
"print(f\"à {p} m, le champ de vue ({champVue:.2f}°) forme une zone de {dx:.1f} m\" ) #taille de la zone perpendiculaire\n",
"print(f\"un pixel représente alors {dcapteur:.1f} cm\")\n",
"\n",
"#autre methode mais qui donne le meme resultat\n",
"#dcapteur=1*np.max(taillePixel)/1000 # (en mm) on considere un pixel sur le capteur\n",
"#dx=dcapteur/f*p #taille original du détail sur le capteur en m\n",
"#print(f\"à {p} m, un pixel voit un détail de {dx*100:.1f} cm \") #les résultats me semblent exagérés...j'essaye de verifier avec le powershotG15\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## essai de modelisation\n",
"![model](./model.png)\n",
"\n",
"si l'angle de la caméra, $\\alpha$, devient petit, le modèle n'a plus trop de sens car cela revient en prendre des photos de face et non par dessus.\n",
"\n",
"Dans ce cas, utilisez uniquement les valeurs de p1 et p2 pour définir la zone nette.\n",
"\n",
"si la caméra photographie le haut de la canopée ($\\alpha$ important), zp1 et zp2 peuvent définir la zone nette"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"#juste pour faire des tests\n",
"#ca correspond plus ou moins au schema ci dessus\n",
"name=\"model\"\n",
"champVue=17\n",
"p=16.5\n",
"p1=13\n",
"p2=19\n",
"#h=7.3 \n",
"#alpha=25 "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"à 424.2640687119285 m, on a dépassé l'hyperfocale\n",
"model\n",
"focale = 30.50 mm, h= 300 m, dist=424.3 m, p1=137.2 m, p2=inf m\n",
"la zone nette se trouve entre z1p=222.0 m et z2p=405.4 m\n",
"en zp1, un pixel représente 3.718348593414414 cm\n",
"en zp2, un pixel représente 5.025059721244474 cm\n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x14d44a838e0>]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"h=300 #en m, hauteur par rapport à la canopee à photographier\n",
"alpha=45 #en degre, angle de la camera\n",
"\n",
"p=h/np.sin(alpha*np.pi/180) #distance de visee\n",
"p1=p*H/(p+H) # debut de zone de netteté\n",
"p2=p*H/(H-p) # fin de zone de netteté\n",
"if p<H:\n",
" print(f\"si mise au point à {p:.2f} m, on est net entre {p1:.2f} m et {p2:.2f} m\")\n",
"else:\n",
" print(f\"à {p} m, on a dépassé l'hyperfocale\")\n",
" p1=H/2\n",
" p2=float('inf') \n",
"\n",
"print(name)\n",
"print(f\"focale = {f:.2f} mm, h= {h} m, dist={p:.1f} m, p1={p1:.1f} m, p2={p2:.1f} m\")\n",
"\n",
"z1=h/np.tan((alpha+champVue/2)*np.pi/180)\n",
"if (alpha-champVue/2)<=0: #le chanp passe au dessus de l'horizon\n",
" z2=float('inf')\n",
"else:\n",
" z2=h/np.tan((alpha-champVue/2)*np.pi/180)\n",
"zf=h/np.tan((alpha)*np.pi/180) \n",
"\n",
"\n",
"dz1=np.sqrt(h**2+z1**2) #en m\n",
"dz2=np.sqrt(h**2+z2**2) #en m\n",
"dzf=np.sqrt(h**2+zf**2) #en m, distance de mise au point\n",
"if False: # mettre true pour afficher\n",
" print(f\"z1={z1:.1f} m\")\n",
" print(f\"zf={zf:.1f} m\")\n",
" print(f\"z2={z2:.1f} m\")\n",
" print(f\"dz1={dz1:.1f} m\")\n",
" print(f\"dzf={dzf:.1f} m\")\n",
" print(f\"dz2={dz2:.1f} m\")\n",
" \n",
"if (dz2<p1/np.cos(champVue/2*np.pi/180)) or (dz1>p2/np.cos(champVue/2*np.pi/180)):\n",