{ "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 [[179, 48]],\n \n [[178, 47]],\n \n [[178, 46]],\n \n [[175, 46]],\n \n [[174, 45]],\n \n [[173, 45]],\n \n [[172, 44]],\n \n [[171, 44]],\n \n [[170, 43]],\n \n [[169, 43]],\n \n [[168, 42]],\n \n [[166, 42]],\n \n [[165, 41]],\n \n [[165, 40]],\n \n [[159, 40]],\n \n [[158, 39]],\n \n [[158, 38]],\n \n [[155, 38]],\n \n [[154, 37]],\n \n [[154, 36]],\n \n [[151, 36]],\n \n [[150, 35]],\n \n [[150, 34]],\n \n [[145, 34]],\n \n [[144, 33]],\n \n [[145, 32]],\n \n [[141, 32]],\n \n [[140, 31]],\n \n [[140, 30]],\n \n [[133, 30]],\n \n [[132, 29]],\n \n [[132, 28]],\n \n [[129, 28]],\n \n [[128, 27]],\n \n [[129, 26]],\n \n [[130, 26]],\n \n [[123, 26]],\n \n [[122, 25]],\n \n [[122, 24]]], dtype=int32))" }, "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 }