用python和opencv实现物体框选并保存坐标信息及面积信息(附代码)

原图:

框选后:

整体思路:将图片进行 高斯滤波 + 灰度处理 + 二值化 等操作,获取处理后图片的HSV值;根据HSV值的范围使用cv2.inRange函数去除背景,查找轮廓线,框选最小矩形,获取坐标信息及面积信息;设置面积范围,在范围内再进行框选,(也可在图片中显示坐标信息并将矩形按面积大小排序),最后保存框选后的图片。

高斯滤波后:

灰度处理后:

二值化:

 

  处理后显示坐标等信息的结果:

 

保存的坐标信息文件:

面积信息文件:

 添加面积限制条件前的结果:

发现在灰度图像上使用cv2.putText时BGR颜色并不能正常显示,所以传给process的图像转到了BGR。

image = cv2.cvtColor(thres_img, cv2.COLOR_GRAY2BGR)

源代码:

import cv2
import numpy as np
import os


# 高斯滤波
def GausBlur(src):
    dst = cv2.GaussianBlur(src, (5, 5), 1.5)
    cv2.imshow('GausBlur', dst)
    return dst


# 灰度处理
def Gray_img(src):
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray', gray)
    return gray


# 二值化
def threshold_img(src):
    ret, binary = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)
    # print("threshold value %s" % ret)
    cv2.imshow('threshold', binary)
    return binary


# 轮廓绘制
def process(image):
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    hsv = cv2.medianBlur(hsv, 5)

    mask = cv2.inRange(hsv, (0, 0, 1), (0, 0, 255))  # inrange

    line = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5), (-1, -1))
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, line)
    # cv2.imshow("mask", mask)

    img, contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours_num = len(contours)
    # print('hierarchy', hierarchy)
    # print(contours_num)

    i = 0
    while i < contours_num:
        c = sorted(contours, key=cv2.contourArea, reverse=True)[i]  # 排序,key为排序比较元素,true为降序
        rect = cv2.minAreaRect(c)
        box = np.int0(cv2.boxPoints(rect))
        # print(box)

        file_path = os.path.join(os.getcwd(), r".\information\coordinate_information.txt")
        file = open(file_path, "a+")
        file.write(str(box) + ',' + '\n')

        area = cv2.contourArea(box)
        file_path = os.path.join(os.getcwd(), r".\information\rect_area.txt")
        file = open(file_path, "a+")
        file.write("rect " + str(i + 1) + " area:" + str(area) + '\n')

        if area >= 1000 and area <= 2000:
            cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
            cv2.putText(image, str(i+1), (box[0][0], box[0][1]), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 111, 111), 3)
            cv2.putText(image, "1." + str(box[0]), (box[0][0], box[0][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
            cv2.putText(image, "2." + str(box[1]), (box[1][0], box[1][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
            cv2.putText(image, "3." + str(box[2]), (box[2][0], box[2][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
            cv2.putText(image, "4." + str(box[3]), (box[3][0], box[3][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
            save_path = r".\images\screenshot\target_rect.jpg"
            cv2.imencode('.jpg', image)[1].tofile(save_path)

        i += 1

    return image

def main(f_path):
    color_image = cv2.imread(f_path + r"\images\target_sliced.jpg", 1)
    gaus_img = GausBlur(color_image)
    gray_img = Gray_img(gaus_img)
    thres_img = threshold_img(gray_img)
    cv2.imencode('.jpg', thres_img)[1].tofile(f_path + r"\images\targets.jpg")
    image = cv2.cvtColor(thres_img, cv2.COLOR_GRAY2BGR)
    result = process(image, f_path)
    # img = cv2.imread(f_path + r"\images\targets.jpg")
    # img_rect = cv2.imread(f_path + r"\images\target_rect.jpg")
#     return result
#
# result = main(r".\test\test3")
# cv2.imshow('result', result)
# key = cv2.waitKey(0)

  • 10
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是Python-OpenCV实现摄像头对蓝色物体检测并框注以及打印中心坐标代码代码如下: ```python import cv2 # 设定蓝色物体颜色范围 lower_blue = np.array([100,50,50]) upper_blue = np.array([130,255,255]) # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头图像 ret, frame = cap.read() # 将图像转换为HSV空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 设定蓝色物体的掩膜 mask = cv2.inRange(hsv, lower_blue, upper_blue) # 腐蚀和膨胀操作,去噪点 mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) # 在掩膜中寻找轮廓,找出物体位置 cnts, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if len(cnts) > 0: # 找出面积最大的轮廓 c = max(cnts, key=cv2.contourArea) # 计算轮廓的最小外接圆 ((x, y), radius) = cv2.minEnclosingCircle(c) # 计算物体的中心坐标 M = cv2.moments(c) center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # 只有当圆形半径大于10时才画圆和中心坐标 if radius > 10: # 在原图像上标记物体位置、圆形和中心坐标 cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 255, 255), -1) # 打印中心坐标 print(center) # 显示图像 cv2.imshow('frame', frame) # 按q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头,并关闭所有窗口 cap.release() cv2.destroyAllWindows() ``` 上述代码将打开电脑的摄像头,设定蓝色物体的掩膜,然后检测图像中的蓝色物体位置,并框注该物体的中心位置,并且打印该物体的中心坐标。执行代码后,将会出现一个窗口,展示摄像头拍摄的图像,并实时标记出蓝色物体的中心位置,同时也会在控制台输出该物体的中心坐标。 以下是代码运行效果截图: ![image-20200306160416481](https://cdn.jsdelivr.net/gh/krislinzhao/IMGcloud/img/image-20200306160416481.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值