308 lines
13 KiB
Plaintext
308 lines
13 KiB
Plaintext
|
{
|
||
|
"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
|
||
|
}
|