mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	only convert pix_fmt when necessary
This commit is contained in:
		
							parent
							
								
									a611cbb942
								
							
						
					
					
						commit
						12c4cd77c5
					
				| @ -375,6 +375,8 @@ def main(): | |||||||
|             best_object = object_processor.get_best(camera_name, label) |             best_object = object_processor.get_best(camera_name, label) | ||||||
|             best_frame = best_object.get('frame', np.zeros((720,1280,3), np.uint8)) |             best_frame = best_object.get('frame', np.zeros((720,1280,3), np.uint8)) | ||||||
| 
 | 
 | ||||||
|  |             best_frame = cv2.cvtColor(best_frame, cv2.COLOR_YUV2BGR_I420) | ||||||
|  |              | ||||||
|             crop = bool(request.args.get('crop', 0, type=int)) |             crop = bool(request.args.get('crop', 0, type=int)) | ||||||
|             if crop: |             if crop: | ||||||
|                 region = best_object.get('region', [0,0,300,300]) |                 region = best_object.get('region', [0,0,300,300]) | ||||||
| @ -384,7 +386,6 @@ def main(): | |||||||
|             width = int(height*best_frame.shape[1]/best_frame.shape[0]) |             width = int(height*best_frame.shape[1]/best_frame.shape[0]) | ||||||
| 
 | 
 | ||||||
|             best_frame = cv2.resize(best_frame, dsize=(width, height), interpolation=cv2.INTER_AREA) |             best_frame = cv2.resize(best_frame, dsize=(width, height), interpolation=cv2.INTER_AREA) | ||||||
|             best_frame = cv2.cvtColor(best_frame, cv2.COLOR_RGB2BGR) |  | ||||||
|             ret, jpg = cv2.imencode('.jpg', best_frame) |             ret, jpg = cv2.imencode('.jpg', best_frame) | ||||||
|             response = make_response(jpg.tobytes()) |             response = make_response(jpg.tobytes()) | ||||||
|             response.headers['Content-Type'] = 'image/jpg' |             response.headers['Content-Type'] = 'image/jpg' | ||||||
| @ -411,11 +412,12 @@ def main(): | |||||||
|             if frame is None: |             if frame is None: | ||||||
|                 frame = np.zeros((720,1280,3), np.uint8) |                 frame = np.zeros((720,1280,3), np.uint8) | ||||||
|              |              | ||||||
|  |             frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) | ||||||
|  | 
 | ||||||
|             height = int(request.args.get('h', str(frame.shape[0]))) |             height = int(request.args.get('h', str(frame.shape[0]))) | ||||||
|             width = int(height*frame.shape[1]/frame.shape[0]) |             width = int(height*frame.shape[1]/frame.shape[0]) | ||||||
| 
 | 
 | ||||||
|             frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_AREA) |             frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_AREA) | ||||||
|             frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) |  | ||||||
| 
 | 
 | ||||||
|             ret, jpg = cv2.imencode('.jpg', frame) |             ret, jpg = cv2.imencode('.jpg', frame) | ||||||
|             response = make_response(jpg.tobytes()) |             response = make_response(jpg.tobytes()) | ||||||
| @ -432,10 +434,10 @@ def main(): | |||||||
|             if frame is None: |             if frame is None: | ||||||
|                 frame = np.zeros((height,int(height*16/9),3), np.uint8) |                 frame = np.zeros((height,int(height*16/9),3), np.uint8) | ||||||
| 
 | 
 | ||||||
|             width = int(height*frame.shape[1]/frame.shape[0]) |             frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) | ||||||
| 
 | 
 | ||||||
|  |             width = int(height*frame.shape[1]/frame.shape[0]) | ||||||
|             frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_LINEAR) |             frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_LINEAR) | ||||||
|             frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) |  | ||||||
| 
 | 
 | ||||||
|             ret, jpg = cv2.imencode('.jpg', frame) |             ret, jpg = cv2.imencode('.jpg', frame) | ||||||
|             yield (b'--frame\r\n' |             yield (b'--frame\r\n' | ||||||
|  | |||||||
| @ -260,7 +260,7 @@ class TrackedObjectProcessor(threading.Thread): | |||||||
|         def snapshot(camera, obj): |         def snapshot(camera, obj): | ||||||
|             if not 'frame' in obj: |             if not 'frame' in obj: | ||||||
|                 return |                 return | ||||||
|             best_frame = cv2.cvtColor(obj['frame'], cv2.COLOR_RGB2BGR) |             best_frame = cv2.cvtColor(obj['frame'], cv2.COLOR_YUV2BGR_I420) | ||||||
|             mqtt_config = self.camera_config[camera].get('mqtt', {'crop_to_region': False}) |             mqtt_config = self.camera_config[camera].get('mqtt', {'crop_to_region': False}) | ||||||
|             if mqtt_config.get('crop_to_region'): |             if mqtt_config.get('crop_to_region'): | ||||||
|                 region = obj['region'] |                 region = obj['region'] | ||||||
|  | |||||||
| @ -70,6 +70,37 @@ def calculate_region(frame_shape, xmin, ymin, xmax, ymax, multiplier=2): | |||||||
| 
 | 
 | ||||||
|     return (x_offset, y_offset, x_offset+size, y_offset+size) |     return (x_offset, y_offset, x_offset+size, y_offset+size) | ||||||
| 
 | 
 | ||||||
|  | def yuv_region_2_rgb(frame, region): | ||||||
|  |     height = frame.shape[0]//3*2 | ||||||
|  |     width = frame.shape[1] | ||||||
|  |     # make sure the size is a multiple of 4 | ||||||
|  |     size = (region[3] - region[1])//4*4 | ||||||
|  | 
 | ||||||
|  |     x1 = region[0]  | ||||||
|  |     y1 = region[1] | ||||||
|  | 
 | ||||||
|  |     uv_x1 = x1//2 | ||||||
|  |     uv_y1 = y1//4 | ||||||
|  | 
 | ||||||
|  |     uv_width = size//2 | ||||||
|  |     uv_height = size//4 | ||||||
|  | 
 | ||||||
|  |     u_y_start = height | ||||||
|  |     v_y_start = height + height//4 | ||||||
|  |     two_x_offset = width//2 | ||||||
|  | 
 | ||||||
|  |     yuv_cropped_frame = np.zeros((size+size//2, size), np.uint8) | ||||||
|  |     # y channel | ||||||
|  |     yuv_cropped_frame[0:size, 0:size] = frame[y1:y1+size, x1:x1+size] | ||||||
|  |     # u channel | ||||||
|  |     yuv_cropped_frame[size:size+uv_height, 0:uv_width] = frame[uv_y1+u_y_start:uv_y1+u_y_start+uv_height, uv_x1:uv_x1+uv_width] | ||||||
|  |     yuv_cropped_frame[size:size+uv_height, uv_width:size] = frame[uv_y1+u_y_start:uv_y1+u_y_start+uv_height, uv_x1+two_x_offset:uv_x1+two_x_offset+uv_width] | ||||||
|  |     # v channel | ||||||
|  |     yuv_cropped_frame[size+uv_height:size+uv_height*2, 0:uv_width] = frame[uv_y1+v_y_start:uv_y1+v_y_start+uv_height, uv_x1:uv_x1+uv_width] | ||||||
|  |     yuv_cropped_frame[size+uv_height:size+uv_height*2, uv_width:size] = frame[uv_y1+v_y_start:uv_y1+v_y_start+uv_height, uv_x1+two_x_offset:uv_x1+two_x_offset+uv_width] | ||||||
|  | 
 | ||||||
|  |     return cv2.cvtColor(yuv_cropped_frame, cv2.COLOR_YUV2RGB_I420) | ||||||
|  | 
 | ||||||
| def intersection(box_a, box_b): | def intersection(box_a, box_b): | ||||||
|     return ( |     return ( | ||||||
|         max(box_a[0], box_b[0]), |         max(box_a[0], box_b[0]), | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ import json | |||||||
| import base64 | import base64 | ||||||
| from typing import Dict, List | from typing import Dict, List | ||||||
| from collections import defaultdict | from collections import defaultdict | ||||||
| from frigate.util import draw_box_with_label, area, calculate_region, clipped, intersection_over_union, intersection, EventsPerSecond, listen, FrameManager, SharedMemoryFrameManager | from frigate.util import draw_box_with_label, yuv_region_2_rgb, area, calculate_region, clipped, intersection_over_union, intersection, EventsPerSecond, listen, FrameManager, SharedMemoryFrameManager | ||||||
| from frigate.objects import ObjectTracker | from frigate.objects import ObjectTracker | ||||||
| from frigate.edgetpu import RemoteObjectDetector | from frigate.edgetpu import RemoteObjectDetector | ||||||
| from frigate.motion import MotionDetector | from frigate.motion import MotionDetector | ||||||
| @ -88,7 +88,7 @@ def filtered(obj, objects_to_track, object_filters, mask=None): | |||||||
|     return False |     return False | ||||||
| 
 | 
 | ||||||
| def create_tensor_input(frame, region): | def create_tensor_input(frame, region): | ||||||
|     cropped_frame = frame[region[1]:region[3], region[0]:region[2]] |     cropped_frame = yuv_region_2_rgb(frame, region) | ||||||
| 
 | 
 | ||||||
|     # Resize to 300x300 if needed |     # Resize to 300x300 if needed | ||||||
|     if cropped_frame.shape != (300, 300, 3): |     if cropped_frame.shape != (300, 300, 3): | ||||||
| @ -304,13 +304,10 @@ def process_frames(camera_name: str, frame_queue: mp.Queue, frame_shape, | |||||||
|         regions = [calculate_region(frame_shape, a[0], a[1], a[2], a[3], 1.0) |         regions = [calculate_region(frame_shape, a[0], a[1], a[2], a[3], 1.0) | ||||||
|             for a in combined_regions] |             for a in combined_regions] | ||||||
| 
 | 
 | ||||||
|         if len(regions) > 0: |  | ||||||
|             rgb_frame = cv2.cvtColor(frame, cv2.COLOR_YUV2RGB_I420) |  | ||||||
| 
 |  | ||||||
|         # resize regions and detect |         # resize regions and detect | ||||||
|         detections = [] |         detections = [] | ||||||
|         for region in regions: |         for region in regions: | ||||||
|             detections.extend(detect(object_detector, rgb_frame, region, objects_to_track, object_filters, mask)) |             detections.extend(detect(object_detector, frame, region, objects_to_track, object_filters, mask)) | ||||||
|          |          | ||||||
|         ######### |         ######### | ||||||
|         # merge objects, check for clipped objects and look again up to 4 times |         # merge objects, check for clipped objects and look again up to 4 times | ||||||
| @ -343,7 +340,7 @@ def process_frames(camera_name: str, frame_queue: mp.Queue, frame_shape, | |||||||
|                             box[0], box[1], |                             box[0], box[1], | ||||||
|                             box[2], box[3]) |                             box[2], box[3]) | ||||||
|                          |                          | ||||||
|                         selected_objects.extend(detect(object_detector, rgb_frame, region, objects_to_track, object_filters, mask)) |                         selected_objects.extend(detect(object_detector, frame, region, objects_to_track, object_filters, mask)) | ||||||
| 
 | 
 | ||||||
|                         refining = True |                         refining = True | ||||||
|                     else: |                     else: | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user