当前位置: 代码迷 >> 综合 >> openCV ROI
  详细解决方案

openCV ROI

热度:90   发布时间:2023-10-12 01:28:56.0
import threadingimport cv2 as cv
import time
import numpy as npclass ROI9527():def __init__(self):passdef draw_Contours(self, contours, img):'''# 绘制自动识别的轮廓  automation 自动识别区域:param contours::param img::return:'''cnt = contours[1:]  # contours 二值图片轮廓    获取全部轮廓Contours_image = cv.drawContours(img, cnt, -1, (0, 0, 255),1)  # 其中参数2就是得到的contours,参数3表示要绘制哪一条轮廓,-1表示绘制所有轮廓,参数4是颜色(B/G/R通道,所以(0,0,255)表示红色),参数5是线宽cv.namedWindow('show Fail', 0)  # O表示显示窗口可以随意手动调节,1cv.imshow("show Fail", Contours_image)  # 显示图片c = cv.waitKey(0)  # 50豪标   显示时间  显示时间越长 卡顿越严重cv.destroyWindow("show Fail")# 显示ROI 有效区域def show_obj_area(self, ROI_list, img):'''自动识别ROI区域显示:param img::return:'''print('ROSlIST: ', ROI_list)print('自动识别ROI区域个数: ', len(ROI_list))new_image = imgfor OBJ_ROI in ROI_list:x_min = OBJ_ROI["x_min"] - 10y_min = OBJ_ROI["y_min"] - 10x_max = OBJ_ROI["x_max"] + 10y_max = OBJ_ROI["y_max"] + 10cv.rectangle(new_image, (x_min, y_min), (x_max, y_max), (4, 211, 41), 2)  # 白色區域  [x列:y列, x列:y行]   # 行差100cv.namedWindow('show_obj_area', 0)  # O表示显示窗口可以随意手动调节,1cv.imshow("show_obj_area", new_image)  # 显示图片c = cv.waitKey(0)  # 50豪标   显示时间  显示时间越长 卡顿越严重cv.destroyAllWindows()def showIMG(self, img, index=9527):'''只用来显示图片:param img::return:'''cv.namedWindow(f'show_img{index}', 0)  # O表示显示窗口可以随意手动调节,1cv.imshow(f'show_img{index}', img)  # 显示图片c = cv.waitKey(0)  # 50豪标   显示时间  显示时间越长 卡顿越严重cv.destroyWindow(f'show_img{index}')def Pictures_of_cutting(self, img):'''图片切割:param img::return:'''img1 = img[350:470, 23:185]  # 截取目标1img2 = img[350:470, 620:780]img3 = img[1370:1490, 23:185]# self.showIMG(img3)return [img1, img2, img3]def readImg(self):img = cv.imread("APP.jpg")img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 图片灰度转换# imgList = self.Pictures_of_cutting(img_gray)  # 图片切割ret, binaryzation_img = cv.threshold(img_gray, 90, 255, cv.THRESH_BINARY_INV)  # 图片二值化# 寻找二值图像的轮廓contours, hierarchy = cv.findContours(binaryzation_img, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)# self.draw_Contours(contours=contours, img=img)  # 画ROI区域obj1 = []  # 目标1ROI_list = []  # 自动识别ROI区域的点存储# ROI 区域处理for i in contours[1:]:  # 0 为最外部边框  所以从index为1开始操作new_np = i.flatten()   # 一维数组a = new_np.reshape(int(len(new_np) / 2), 2)  # 维度转换 二维b = np.argmin(a, axis=0)c = np.argmax(a, axis=0)# 感兴趣区域 画正方形x_min = a[b][0][0]  # ROI 感兴趣区域 正方形X轴 最小值y_min = a[b][1][1]  # ROI 感兴趣区域 正方形y轴 最小值x_max = a[c][0][0]  # ROI 感兴趣区域 正方形X轴 最大值y_max = a[c][1][1]  # ROI 感兴趣区域 正方形y轴 最小值if 200 < y_min < 500 and 0 < x_min < 200:obj1.append([y_min, y_max, x_min, x_max])continuey_minList = []y_maxList = []x_minList = []x_maxList = []for i in obj1:y_minList.append(i[0])y_maxList.append(i[1])x_minList.append(i[2])x_maxList.append(i[3])print(min(y_minList), max(y_maxList), min(x_minList), max(x_maxList))ROI_list.append({"y_min": min(y_minList),"y_max": max(y_maxList),"x_min": min(x_minList),"x_max": max(x_maxList),})# ROI 对象有效区域显示  自动获取ROI区域显示self.show_obj_area(ROI_list, img)exit()former_image_handle = False   # True 原图,  False 为处理二值图片obj_ROI_sum_pixel = 200print('ROSlIST: ', ROI_list)print('自动识别ROI区域个数: ', len(ROI_list))threading.Thread(target=self.show_obj_area, args=(ROI_list,img, )).start()for index, ROI_OBJ in enumerate(ROI_list):if former_image_handle:print("原图处理")ROI2 = img[ROI_OBJ["y_min"]:ROI_OBJ["y_max"], ROI_OBJ["x_min"]:ROI_OBJ["x_max"]]  # 基于原图进行计算判断else:  # 二值图片处理print("二值图处理")print("点的像素坐表: ", ROI_OBJ)# ROI1 = self.binaryzation_img[self.ROI_list[0]["x_min"]:self.ROI_list[0]["x_max"], self.ROI_list[0]["y_min"]:self. ROI_list[0]["y_max"]]ROI1 = img_gray[ROI_OBJ["y_min"]:ROI_OBJ["y_max"],       # 垂直截取长度ROI_OBJ["x_min"]:ROI_OBJ["x_max"]]  # 基于二值化图片进行结果判断   # 横向截取长度# 二值化后图片黑白化  目标黑色  背景白色white_pixel = ROI1[ROI1 == 255]  # 白像素点值 ROI内的像素black_pixel = ROI1[ROI1 == 0]  # 黑像素点print(white_pixel)print(black_pixel)self.showIMG(ROI1, index)continue# 整体判断结果  整体结果PASS 则全pass# if int(len(self.ROI_PASS_LIST)) >= int(self.LED_number):  # 测试对象,  与 需要测试对象长度对比,  必须相等 判为PASS 否则 FAIL#     if not self.PASS_ROI_record:  # 是否有记录  setting ROI 历史记录坐标 无记录 则在第一次测试PASS后初始化保存文档#         self.LED_site_record(self.ROI_PASS_LIST)  # 位置记录  后备之需#     self.LED_test_result = self.if_blue_white()  # 判断当前测试项#     if_not_FAIL = True#     for test_result in self.LED_test_result:#         if self.LED_test_result[test_result] == "PASS":#             pass#         elif self.LED_test_result[test_result] == "FAIL":#             # self.draw_Fail()  # 画无值#             threading.Thread(target=self.draw_Fail).start()#             # multiprocessing.Process(target=self.draw_Fail).start()#             # self.draw_Fail()#             # self.output_result(self.LED_test_result)#             if_not_FAIL = False#             break#     if if_not_FAIL:#         for test_result in self.LED_test_result:#             print("%s=%s" % (test_result, self.LED_test_result[test_result]))#     cv.imwrite(self.save_result_img_path, self.photo_image)# # Fail 后处理# else:#     self.LED_test_result = self.if_blue_white()  # 判断当前测试项#     draw_Fail_List = []#     for Fail_ROI in self.ROI_FAIL_LIST:  # 画值FAIL#         draw_Fail_List.append(#             {"x_min": Fail_ROI["x_min"], "y_min": Fail_ROI["y_min"], "x_max": Fail_ROI["x_max"],#              "y_max": Fail_ROI["y_max"]})#         cv.rectangle(self.photo_image, (Fail_ROI["x_min"], Fail_ROI["y_min"]),#                      (Fail_ROI["x_max"], Fail_ROI["y_max"]), (0, 0, 255), 2)  # 白色區域  [x列:y列, x列:y行]   # 行差100#     if draw_Fail_List:#         self.q_draw_Fail_List.put(draw_Fail_List)#         draw_Fail_List = []#     if self.PASS_ROI_record:  # 有过pass ROI 记录#         # self.draw_Fail()  # 画无值#         threading.Thread(target=self.draw_Fail).start()#         # multiprocessing.Process(target=self.draw_Fail).start()#         # self.draw_Fail()#     self.output_result(self.LED_test_result)# send_str = []# for result in self.LED_test_result:#     send_str.append(str(result) + "=" + str(self.LED_test_result[result]))# send_result = ("\n".join(send_str)).encode("utf8")# self.q_send.put(send_result)  # 结果返回if __name__ == '__main__':ROIobj = ROI9527()ROIobj.readImg()