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()
详细解决方案
openCV ROI
热度:90 发布时间:2023-10-12 01:28:56.0
相关解决方案
- OpenCV学习笔记1 OpenCV 2.49 + Eclipse 配置教程
- openCV 安装异常
- opencv arm下打开摄像头失败,该怎么解决
- qt + opencv cvwriteframe写帧到视频文件失败,该怎么处理
- qt opencv ffmpeg,该如何处理
- opencv 环境搭建一个有关问题
- 通译:Mastering OpenCV with Practical Computer Vision Projects(第8章)(二)
- python opencv - blob检测或圆检测
- 如何在opencv(opencv-master)python中执行背景减法
- 检测黑白图像上的白色矩形并裁剪(OpenCV)
- OpenCV 图像处理(二)-图像相关操作
- openCV ROI
- ImportError: libSM.so.6 libXrender.so.1 libXext.so.6 docker opencv
- opencv 版本问题
- Hisi3516二维码识别:交叉编译zbar+opencv
- opencv cv2.dnn.readNetFromCaffe()通道错误问题
- opencv 表格提取算法实现
- 【OpenCv】三天学会C++/OPENCV2基本操作之图像算数
- cv2.error: OpenCV
- openCV 小结5——基本操作
- openCV 小结4——论计时函数
- openCV 小结3——CMakeLists.txt的写法
- openCV 小结2——常用数据结构和函数
- openCV 小结1——论main()函数和Mat类
- (一)opencv 视屏读写
- opencv 大图中找小图,并点击小图
- opencv 学习1
- 目标检测与位姿估计(二十三):OpenCV+Aruco完成目标检测
- linux下安装Anaconda tensorflow opencv
- Opencv-PythonPython中opencv模块cv2一些函数用法及简介