以下是一个使用OpenCV库中的SIFT算法提取图片特征并将其存入MySQL数据库的示例:\n\npython\nimport cv2\nimport mysql.connector\nfrom mysql.connector import Error\nimport numpy as np\n\ndef extract_sift_features(image_path):\n # 加载图像\n image = cv2.imread(image_path)\n\n # 创建SIFT对象\n sift = cv2.xfeatures2d.SIFT_create()\n\n # 检测关键点和计算特征描述符\n keypoints, descriptors = sift.detectAndCompute(image, None)\n\n return keypoints, descriptors\n\ndef save_features_to_database(image_path, keypoints, descriptors):\n try:\n # 连接到MySQL数据库\n connection = mysql.connector.connect(host='localhost',\n database='your_database',\n user='your_username',\n password='your_password')\n if connection.is_connected():\n cursor = connection.cursor()\n\n # 创建存储特征的表\n cursor.execute("CREATE TABLE IF NOT EXISTS image_features (id INT AUTO_INCREMENT PRIMARY KEY, image_path VARCHAR(255), keypoints TEXT, descriptors TEXT)")\n\n # 将特征数据插入到表中\n keypoints_str = np.array2string(np.asarray([kp.pt for kp in keypoints]), separator=',')\n descriptors_str = np.array2string(descriptors, separator=',')\n cursor.execute("INSERT INTO image_features (image_path, keypoints, descriptors) VALUES (%s, %s, %s)", (image_path, keypoints_str, descriptors_str))\n connection.commit()\n\n except Error as e:\n print("Error while connecting to MySQL", e)\n\n finally:\n if connection.is_connected():\n cursor.close()\n connection.close()\n\ndef search_similar_images(image_path, threshold=0.7):\n try:\n # 连接到MySQL数据库\n connection = mysql.connector.connect(host='localhost',\n database='your_database',\n user='your_username',\n password='your_password')\n\n if connection.is_connected():\n cursor = connection.cursor()\n\n # 从数据库中获取所有特征\n cursor.execute("SELECT image_path, keypoints, descriptors FROM image_features")\n rows = cursor.fetchall()\n\n # 加载输入图像并提取特征\n query_keypoints, query_descriptors = extract_sift_features(image_path)\n\n # 对每个数据库中的图像进行比较\n for row in rows:\n db_image_path, db_keypoints_str, db_descriptors_str = row\n\n # 将字符串转换为NumPy数组\n db_keypoints = np.asarray(eval(db_keypoints_str))\n db_descriptors = np.asarray(eval(db_descriptors_str))\n\n # 使用FlannBasedMatcher计算匹配的特征点\n matcher = cv2.FlannBasedMatcher()\n matches = matcher.knnMatch(query_descriptors, db_descriptors, k=2)\n\n # 选择良好的匹配\n good_matches = []\n for m, n in matches:\n if m.distance < threshold * n.distance:\n good_matches.append(m)\n\n # 如果匹配数超过阈值,则输出匹配的图像路径\n if len(good_matches) > 10:\n print("Match found with", db_image_path)\n\n except Error as e:\n print("Error while connecting to MySQL", e)\n\n finally:\n if connection.is_connected():\n cursor.close()\n connection.close()\n\n# 提取特征并将其保存到数据库\nimage_path = 'path/to/your/image.jpg'\nkeypoints, descriptors = extract_sift_features(image_path)\nsave_features_to_database(image_path, keypoints, descriptors)\n\n# 搜索相似的图像\nquery_image_path = 'path/to/your/query_image.jpg'\nsearch_similar_images(query_image_path)\n\n\n请确保你已经安装了opencv-pythonmysql-connector-python库,并将代码中的your_databaseyour_usernameyour_password替换为你的MySQL数据库的名称、用户名和密码。另外,你需要提前创建一个名为image_features的表,用于存储特征数据。


原文地址: https://www.cveoy.top/t/topic/qqRh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录