【Opencv】形态化处理进行物体识别定位

opencv 检测外观尺寸

流程:打开摄像头–灰度化–高斯滤波–边缘检测–膨胀腐蚀–找到轮廓
(1)轮廓是圆的话,获取其最小的外包络圆,得到其圆心与半径,进行结果绘制。结果如下:
在这里插入图片描述
(2)轮廓是矩形的话,获取其最小的外接矩形,得到其四个点的坐标与倾斜角度,进行结果绘制。结果如下:
在这里插入图片描述

import cv2
import numpy as np
import math
import argparse


def initializeTrackbars(intialTracbarVals=0):
    cv2.namedWindow("Trackbars")
    cv2.resizeWindow("Trackbars", 360, 240)
    cv2.createTrackbar("Threshold1", "Trackbars", 200,255, nothing)
    cv2.createTrackbar("Threshold2", "Trackbars", 200, 255, nothing)

def main(is_circle = True,):
    cap = cv2.VideoCapture(0)
    cap.set(10,160)
    heightImg = 640
    widthImg  = 480

    def gradient(pt1, pt2):
        return (pt2[1] - pt1[1]) / (pt2[0] - pt1[0])

    initializeTrackbars()

    while True:
        ret,frame = cap.read()
        frame = cv2.resize(frame,(heightImg,widthImg))
        img = frame.copy()
        img1 = frame.copy()
        imgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # CONVERT IMAGE TO GRAY SCALE
        imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # ADD GAUSSIAN BLUR
        thres = utlis.valTrackbars()  # GET TRACK BAR VALUES FOR THRESHOLDS
        imgThreshold = cv2.Canny(imgBlur, thres[0], thres[1])

        kernel = np.ones((5, 5))
        imgDial = cv2.dilate(imgThreshold, kernel, iterations=2)  # APPLY DILATION
        imgThreshold = cv2.erode(imgDial, kernel, iterations=1)  # APPLY EROSION
        contours, hierarchy = cv2.findContours(imgThreshold, cv2.RETR_EXTERNAL,
                                               cv2.CHAIN_APPROX_SIMPLE)  # FIND ALL CONTOURS
        cv2.drawContours(frame, contours, -1, (0, 255, 0), 10)
        if len(contours)>=1:
            position = np.squeeze(contours[0])
            is_pass = True
        else:
            is_pass = False

        if is_circle:
            if is_pass:
                (x,y),radius = cv2.minEnclosingCircle(np.array(position))
                x,y,radius = int(x),int(y),int(radius)
                img = cv2.circle(img, (x, y), 10, (255, 255, 0), -1)
                frame_circle = cv2.circle(img,(x,y),radius,(0,255,255),5)
                print(x,y)
                cv2.putText(frame_circle, "Circle-Detection", (20, 25),
                            cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.5, (0, 255, 255), 2)
                cv2.putText(frame_circle,"position: "+str(x)+", "+str(y),(20,60),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,255),2)
                # cv2.imshow("frame2", frame_circle)
        else:
            rect = cv2.minAreaRect(np.array(position))
            center_x,center_y = int(rect[0][0]),int(rect[0][1])
            # angle = int(rect[2])
            box = cv2.boxPoints(rect)
            box = np.int0(box)
            # 获取四个顶点坐标
            left_point_x = np.min(box[:, 0])
            right_point_x = np.max(box[:, 0])
            top_point_y = np.min(box[:, 1])
            bottom_point_y = np.max(box[:, 1])

            left_point_y = box[:, 1][np.where(box[:, 0] == left_point_x)][0]
            right_point_y = box[:, 1][np.where(box[:, 0] == right_point_x)][0]
            top_point_x = box[:, 0][np.where(box[:, 1] == top_point_y)][0]
            bottom_point_x = box[:, 0][np.where(box[:, 1] == bottom_point_y)][0]
            # 上下左右四个点坐标
            vertices = np.array([[top_point_x, top_point_y],  [left_point_x, left_point_y],[bottom_point_x, bottom_point_y],
                                 [right_point_x, right_point_y]])
            pt2, pt1, pt3 = vertices[-3:]
            l1 = (top_point_x - left_point_x) ** 2 + (top_point_y - left_point_y) ** 2
            l2 = (bottom_point_x - left_point_x) ** 2 + (bottom_point_y - left_point_y) ** 2
            if l1 > l2:
                angle = gradient(pt1, pt2)
            else:
                angle = gradient(pt1, pt3)
            angle = math.atan(angle)
            angle = round(math.degrees(angle))

            vertices = vertices.reshape(-1,1,2)
            cv2.polylines(img,[vertices],isClosed=True,color=(255,255,0),thickness=5)
            cv2.putText(img, "Rect-Detection" , (20, 25),
                        cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.5, (0, 255, 255), 2)
            cv2.putText(img, "position: " + str(center_x) + ", " + str(center_y), (20, 60), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1,
                        (0, 255, 255), 2)
            cv2.putText(img, "angle: " + str(angle), (20, 80), cv2.FONT_HERSHEY_COMPLEX_SMALL,
                        1,
                        (0, 255, 255), 2)


        result = np.concatenate((frame,img),axis=1)

        cv2.imshow("result", result)


        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":

    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument("--iscircle", help="true:circle,false:rectangle",
                        type=bool,default=False)
    args = parser.parse_args()

    main(is_circle=True)

  • 2
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OpenCV是一个开源的计算机视觉库,可以用于图像和视频处理。它提供了许多功能,包括物体识别。在OpenCV中,可以使用训练好的分类器文件来实现物体识别。这些分类器文件可以用于识别人脸、车辆、动物等各种物体。 要进行物体识别,首先需要准备训练自己的分类器文件。这可以通过使用OpenCV提供的两个程序来实现:opencv_createsamples.exe和opencv_traincascade.exe。这些程序可以在OpenCV安装包的目录下找到。\[1\] 准备样本数据是进行物体识别的重要步骤。可以使用一些包含目标物体的图像作为样本数据。在样本数据准备阶段,可以对图像进行一些预处理操作,例如将图像转换为HSV颜色空间、进行中值滤波去除噪声、进行开运算等。\[2\] 下面是一个示例代码,展示了如何使用OpenCV进行物体识别。该代码读取一张橙子的图片,将其转换为HSV颜色空间,然后进行中值滤波、颜色阈值处理形态学操作,最后通过轮廓提取和绘制边界框来实现物体识别。\[3\] ```python import cv2 def process(image): hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) hsv = cv2.medianBlur(hsv, 5) mask = cv2.inRange(hsv, (11, 43, 46), (25, 255, 255)) line = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5), (-1, -1)) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, line) contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) index = -1 max_area = 0 font = cv2.FONT_HERSHEY_SIMPLEX for c in range(len(contours)): area = cv2.contourArea(contours\[c\]) if area > max_area: max_area = area index = c if index >= 0: x, y, w, h = cv2.boundingRect(contours\[index\]) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(image, "orange", (x, y), font, 1.2, (0, 0, 255), 2) return image image = cv2.imread("c1.jpeg") result = process(image) cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码读取一张名为"c1.jpeg"的图片,然后调用process函数进行物体识别,并将结果显示出来。在这个示例中,我们使用了橙子作为目标物体进行识别,识别结果会在图片上绘制出边界框并标注为"orange"。\[3\] 希望这个回答能够帮助到您! #### 引用[.reference_title] - *1* [opencv训练自己的模型,实现特定物体的识别](https://blog.csdn.net/new9232/article/details/127439039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [opencv物体识别-识别水果](https://blog.csdn.net/qq_52095705/article/details/121568221)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值