Embedded_game/polygon/001.ipynb

308 lines
13 KiB
Plaintext
Raw Permalink Normal View History

2025-01-02 12:48:11 +08:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2023-10-28T01:01:26.562839300Z",
"start_time": "2023-10-28T01:01:26.547183700Z"
}
},
"outputs": [],
"source": [
"import cv2\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 10,
"outputs": [],
"source": [
"def cv_show(image):\n",
" cv2.imshow('cv_show', image)\n",
" cv2.waitKey(0)\n",
" cv2.destroyAllWindows()"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:03:21.120045800Z",
"start_time": "2023-10-28T01:03:21.104347200Z"
}
},
"id": "a1f22f01908ffdac"
},
{
"cell_type": "code",
"execution_count": 29,
"outputs": [],
"source": [
"def detect_shape(contour):\n",
" epsilon = 0.04 * cv2.arcLength(contour, True)\n",
" approx = cv2.approxPolyDP(contour, epsilon, True)\n",
"\n",
" # 根据角点数量判断形状\n",
" if len(approx) == 3:\n",
" return \"三角形\"\n",
" elif len(approx) == 4:\n",
" return \"四边形\"\n",
" elif len(approx) == 5:\n",
" return \"五角星\"\n",
" else:\n",
" # 使用周长与面积的比值来判断圆形\n",
" area = cv2.contourArea(contour)\n",
" perimeter = cv2.arcLength(contour, True)\n",
" radius = perimeter / (2 * np.pi)\n",
" circle_area = np.pi * (radius ** 2)\n",
"\n",
" # 这里0.2只是一个近似值,可能需要根据你的需求进行调整\n",
" if abs(circle_area - area) < area * 0.2:\n",
" return \"圆形\"\n",
" else:\n",
" return \"未知形状\""
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:28:34.321255200Z",
"start_time": "2023-10-28T01:28:34.304785300Z"
}
},
"id": "7e73564bd656ae50"
},
{
"cell_type": "code",
"execution_count": 11,
"outputs": [
{
"data": {
"text/plain": "array([[[ 76, 98, 50],\n [ 75, 95, 48],\n [ 75, 94, 45],\n ...,\n [174, 118, 69],\n [174, 118, 69],\n [174, 118, 69]],\n\n [[ 72, 94, 46],\n [ 74, 95, 46],\n [ 76, 95, 46],\n ...,\n [175, 119, 70],\n [175, 119, 70],\n [175, 119, 70]],\n\n [[ 83, 97, 49],\n [ 82, 94, 46],\n [ 79, 89, 42],\n ...,\n [176, 120, 71],\n [176, 120, 71],\n [176, 120, 71]],\n\n ...,\n\n [[ 52, 19, 4],\n [ 53, 20, 4],\n [ 53, 21, 2],\n ...,\n [255, 211, 147],\n [255, 211, 147],\n [255, 212, 148]],\n\n [[ 45, 13, 7],\n [ 45, 14, 5],\n [ 45, 15, 4],\n ...,\n [252, 213, 144],\n [253, 214, 145],\n [254, 215, 146]],\n\n [[ 43, 11, 5],\n [ 43, 12, 3],\n [ 44, 14, 3],\n ...,\n [255, 223, 148],\n [255, 223, 148],\n [255, 225, 150]]], dtype=uint8)"
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = cv2.imread('exp4/crops/polygon/new_3.jpg')\n",
"img"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:03:21.285575Z",
"start_time": "2023-10-28T01:03:21.269929600Z"
}
},
"id": "8ef6052bbd64e86a"
},
{
"cell_type": "code",
"execution_count": 16,
"outputs": [],
"source": [
"cv_show(img)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:08:37.074455600Z",
"start_time": "2023-10-28T01:08:32.039873500Z"
}
},
"id": "8f857c59a1212cf7"
},
{
"cell_type": "code",
"execution_count": 14,
"outputs": [
{
"data": {
"text/plain": "(104, 255, 3)"
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"h, w, _ = img.shape\n",
"h, w, _"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:05:28.383545700Z",
"start_time": "2023-10-28T01:05:28.367917100Z"
}
},
"id": "e8cce93d1f7d8907"
},
{
"cell_type": "code",
"execution_count": 15,
"outputs": [
{
"data": {
"text/plain": "array([ 51, 11, 117], dtype=uint8)"
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"center_color = img[h//2, w//2]\n",
"center_color"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:05:53.791598700Z",
"start_time": "2023-10-28T01:05:53.780081100Z"
}
},
"id": "7367414ac7c27ca4"
},
{
"cell_type": "code",
"execution_count": 18,
"outputs": [],
"source": [
"# 将中心点的颜色转换为HSV格式\n",
"hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"center_color_hsv = cv2.cvtColor(np.uint8([[center_color]]), cv2.COLOR_BGR2HSV)[0][0]"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:14:22.487610200Z",
"start_time": "2023-10-28T01:14:22.471949100Z"
}
},
"id": "d332f08bb4239c24"
},
{
"cell_type": "code",
"execution_count": 19,
"outputs": [],
"source": [
"lower_bound = np.array([center_color_hsv[0] - 10, 50, 50])\n",
"upper_bound = np.array([center_color_hsv[0] + 10, 255, 255])\n",
"mask = cv2.inRange(hsv, lower_bound, upper_bound)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:16:15.097208700Z",
"start_time": "2023-10-28T01:16:15.066225800Z"
}
},
"id": "32928196d5e9acbc"
},
{
"cell_type": "code",
"execution_count": 21,
"outputs": [
{
"data": {
"text/plain": "(array([[[160, 38]]], dtype=int32),\n array([[[107, 24]],\n \n [[105, 26]],\n \n [[101, 26]],\n \n [[102, 27]],\n \n [[101, 28]],\n \n [[ 94, 28]],\n \n [[ 95, 28]],\n \n [[ 96, 29]],\n \n [[ 95, 30]],\n \n [[ 91, 30]],\n \n [[ 92, 30]],\n \n [[ 93, 31]],\n \n [[ 92, 32]],\n \n [[ 87, 32]],\n \n [[ 87, 33]],\n \n [[ 86, 34]],\n \n [[ 79, 34]],\n \n [[ 80, 35]],\n \n [[ 79, 36]],\n \n [[ 73, 36]],\n \n [[ 73, 37]],\n \n [[ 72, 38]],\n \n [[ 71, 38]],\n \n [[ 71, 39]],\n \n [[ 70, 40]],\n \n [[ 66, 40]],\n \n [[ 64, 42]],\n \n [[ 58, 42]],\n \n [[ 56, 44]],\n \n [[ 53, 44]],\n \n [[ 54, 44]],\n \n [[ 55, 45]],\n \n [[ 54, 46]],\n \n [[ 49, 46]],\n \n [[ 49, 47]],\n \n [[ 48, 48]],\n \n [[ 42, 48]],\n \n [[ 42, 49]],\n \n [[ 41, 50]],\n \n [[ 39, 50]],\n \n [[ 39, 51]],\n \n [[ 38, 52]],\n \n [[ 37, 52]],\n \n [[ 37, 53]],\n \n [[ 39, 55]],\n \n [[ 40, 55]],\n \n [[ 41, 56]],\n \n [[ 41, 57]],\n \n [[ 46, 57]],\n \n [[ 47, 58]],\n \n [[ 46, 59]],\n \n [[ 51, 59]],\n \n [[ 52, 60]],\n \n [[ 51, 61]],\n \n [[ 55, 61]],\n \n [[ 56, 62]],\n \n [[ 57, 62]],\n \n [[ 58, 63]],\n \n [[ 60, 63]],\n \n [[ 61, 64]],\n \n [[ 60, 65]],\n \n [[ 59, 65]],\n \n [[ 66, 65]],\n \n [[ 67, 66]],\n \n [[ 67, 67]],\n \n [[ 70, 67]],\n \n [[ 71, 68]],\n \n [[ 71, 69]],\n \n [[ 74, 69]],\n \n [[ 75, 70]],\n \n [[ 75, 71]],\n \n [[ 78, 71]],\n \n [[ 79, 72]],\n \n [[ 79, 73]],\n \n [[ 85, 73]],\n \n [[ 86, 74]],\n \n [[ 85, 75]],\n \n [[ 90, 75]],\n \n [[ 91, 76]],\n \n [[ 91, 77]],\n \n [[ 95, 77]],\n \n [[ 97, 79]],\n \n [[100, 79]],\n \n [[101, 80]],\n \n [[101, 81]],\n \n [[105, 81]],\n \n [[106, 82]],\n \n [[106, 83]],\n \n [[110, 83]],\n \n [[111, 84]],\n \n [[111, 85]],\n \n [[115, 85]],\n \n [[116, 86]],\n \n [[116, 87]],\n \n [[123, 87]],\n \n [[124, 88]],\n \n [[124, 89]],\n \n [[128, 89]],\n \n [[130, 87]],\n \n [[134, 87]],\n \n [[136, 85]],\n \n [[138, 85]],\n \n [[137, 84]],\n \n [[138, 83]],\n \n [[144, 83]],\n \n [[144, 82]],\n \n [[145, 81]],\n \n [[152, 81]],\n \n [[152, 80]],\n \n [[153, 79]],\n \n [[154, 79]],\n \n [[155, 78]],\n \n [[156, 78]],\n \n [[157, 77]],\n \n [[161, 77]],\n \n [[163, 75]],\n \n [[167, 75]],\n \n [[167, 74]],\n \n [[168, 73]],\n \n [[172, 73]],\n \n [[172, 72]],\n \n [[173, 71]],\n \n [[178, 71]],\n \n [[178, 70]],\n \n [[179, 69]],\n \n [[184, 69]],\n \n [[183, 68]],\n \n [[184, 67]],\n \n [[190, 67]],\n \n [[190, 66]],\n \n [[191, 65]],\n \n [[194, 65]],\n \n [[194, 64]],\n \n [[195, 63]],\n \n [[200, 63]],\n \n [[200, 62]],\n \n [[201, 61]],\n \n [[202, 61]],\n \n [[203, 60]],\n \n [[204, 60]],\n \n [[204, 56]],\n \n [[203, 57]],\n \n [[202, 56]],\n \n [[201, 56]],\n \n [[200, 55]],\n \n [[201, 54]],\n \n [[197, 54]],\n \n [[196, 53]],\n \n [[196, 52]],\n \n [[194, 52]],\n \n [[193, 51]],\n \n [[194, 50]],\n \n [[187, 50]],\n \n [[186, 49]],\n \n [[186, 48]],\n \n
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n",
"contours"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:17:34.166907500Z",
"start_time": "2023-10-28T01:17:34.119716300Z"
}
},
"id": "5df8067fe737e4de"
},
{
"cell_type": "code",
"execution_count": 22,
"outputs": [],
"source": [
"largest_contour = max(contours, key=cv2.contourArea)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:18:15.980045Z",
"start_time": "2023-10-28T01:18:15.964409700Z"
}
},
"id": "bf2e63642f20cf04"
},
{
"cell_type": "code",
"execution_count": 30,
"outputs": [
{
"data": {
"text/plain": "'四边形'"
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shape = detect_shape(largest_contour)\n",
"shape"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-28T01:28:38.928986600Z",
"start_time": "2023-10-28T01:28:38.921384500Z"
}
},
"id": "1396961361c46fa6"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
"id": "d58ca0c66235f91e"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}