0.帧间差分法
import cv2
def cv2_display(image_ndarray):
windowName = 'display'
cv2.imshow(windowName, image_ndarray)
pressKey = cv2.waitKey(0)
if 27 == pressKey or ord('q') == pressKey:
cv2.destroyAllWindows()
image_ndarray_1 = cv2.imread('../resources/1.jpg')
image_ndarray_2 = cv2.imread('../resources/2.jpg')
cv2_display(image_ndarray_1)
cv2_display(image_ndarray_2)
def get_processedImage(image_ndarray):
image_ndarray_1 = cv2.cvtColor(image_ndarray, cv2.COLOR_BGR2GRAY)
filter_size = 7
image_ndarray_2 = cv2.GaussianBlur(image_ndarray_1, (filter_size, filter_size), 0)
return image_ndarray_2
image_ndarray_1_2 = get_processedImage(image_ndarray_1)
image_ndarray_2_2 = get_processedImage(image_ndarray_2)
cv2_display(image_ndarray_1_2)
cv2_display(image_ndarray_2_2)
absdiff_ndarray = cv2.absdiff(image_ndarray_1_2, image_ndarray_2_2)
cv2_display(absdiff_ndarray)
import datetime
image_ndarray_3 = image_ndarray_2.copy()
for contour in contour_list:
if cv2.contourArea(contour) < 2000:
continue
else:
x1, y1, w, h = cv2.boundingRect(contour)
x2, y2 = x1 + w, y1 + h
leftTop_coordinate = x1, y1
rightBottom_coordinate = x2, y2
bgr_color = (0, 0, 255)
thickness = 2
cv2.rectangle(image_ndarray_3, leftTop_coordinate, rightBottom_coordinate, bgr_color, thickness)
text = "Find motion object! x=%d, y=%d" %(x1, y1)
print(text)
cv2.putText(image_ndarray_3, text, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)
time_string = datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p")
_ = cv2.putText(image_ndarray_3, time_string, (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)
cv2_display(image_ndarray_3)
1.相机捕捉照片
import os
import cv2
import mvsdk
def get_capturedImage(imageFilePath=None):
if not imageFilePath:
imageFilePath = '../resources/temp.jpg'
device_list = mvsdk.CameraEnumerateDevice()
if len(device_list) == 0:
return None
device_info = device_list[0]
cameraIndex = mvsdk.CameraInit(device_info, -1, -1)
capability = mvsdk.CameraGetCapability(cameraIndex)
mvsdk.CameraSetTriggerMode(cameraIndex, 0)
configFilePath = '../resources/camera.Config'
assert os.path.exists(configFilePath), 'please check if exists %s'%configFilePath
mvsdk.CameraReadParameterFromFile(cameraIndex, configFilePath)
mvsdk.CameraPlay(cameraIndex)
FrameBufferSize = capability.sResolutionRange.iWidthMax * capability.sResolutionRange.iHeightMax * 3
FrameBuffer_address = mvsdk.CameraAlignMalloc(FrameBufferSize, 16)
RawData, FrameHead = mvsdk.CameraGetImageBuffer(cameraIndex, 2000)
mvsdk.CameraImageProcess(cameraIndex, RawData, FrameBuffer_address, FrameHead)
mvsdk.CameraReleaseImageBuffer(cameraIndex, RawData)
imageFilePath_1 = os.path.abspath(imageFilePath)
status = mvsdk.CameraSaveImage(cameraIndex, imageFilePath_1, FrameBuffer_address, FrameHead, mvsdk.FILE_JPG, 100)
if status != mvsdk.CAMERA_STATUS_SUCCESS:
print('ID为%d的相机拍摄并保存照片失败!!!')
is_successful = False
else:
print('ID为%d的相机保存照片至路径:%s' %(cameraIndex, imageFilePath_1))
is_successful = True
mvsdk.CameraUnInit(cameraIndex)
mvsdk.CameraAlignFree(FrameBuffer_address)
2.移动物检测
import os
import cv2
import mvsdk
def get_capturedImage(cameraIndex):
imageFilePath = '../resources/temp.jpg'
capability = mvsdk.CameraGetCapability(cameraIndex)
mvsdk.CameraSetTriggerMode(cameraIndex, 0)
configFilePath = '../resources/camera.Config'
assert os.path.exists(configFilePath), 'please check if exists %s'%configFilePath
mvsdk.CameraReadParameterFromFile(cameraIndex, configFilePath)
mvsdk.CameraPlay(cameraIndex)
frameBufferSize = capability.sResolutionRange.iWidthMax * capability.sResolutionRange.iHeightMax * 3
frameBufferAddress = mvsdk.CameraAlignMalloc(frameBufferSize, 16)
rawData, frameHead = mvsdk.CameraGetImageBuffer(cameraIndex, 2000)
mvsdk.CameraImageProcess(cameraIndex, rawData, frameBufferAddress, frameHead)
mvsdk.CameraReleaseImageBuffer(cameraIndex, rawData)
imageFilePath_1 = os.path.abspath(imageFilePath)
status = mvsdk.CameraSaveImage(cameraIndex, imageFilePath_1, frameBufferAddress, frameHead, mvsdk.FILE_JPG, 100)
if status != mvsdk.CAMERA_STATUS_SUCCESS:
print('ID为%d的相机拍摄并保存照片失败!!!')
is_successful = False
else:
is_successful = True
image_ndarray = cv2.imread(imageFilePath) if is_successful else None
return image_ndarray
def get_processedImage(image_ndarray):
image_ndarray_1 = cv2.cvtColor(image_ndarray, cv2.COLOR_BGR2GRAY)
filter_size = 15
image_ndarray_2 = cv2.GaussianBlur(image_ndarray_1, (filter_size, filter_size), 0)
return image_ndarray_2
import time
def get_timeString():
now_timestamp = time.time()
now_structTime = time.localtime(now_timestamp)
timeString_pattern = '%Y %m %d %H:%M:%S'
now_timeString = time.strftime(timeString_pattern, now_structTime)
return now_timeString
def get_drawedDetectedImage(first_image_ndarray, second_image_ndarray):
if second_image_ndarray is None or first_image_ndarray is None:
return None
first_image_ndarray_2 = get_processedImage(first_image_ndarray)
second_image_ndarray_2 = get_processedImage(second_image_ndarray)
absdiff_ndarray = cv2.absdiff(first_image_ndarray_2, second_image_ndarray_2)
threshold_ndarray = cv2.threshold(absdiff_ndarray, 25, 255, cv2.THRESH_BINARY)[1]
dilate_ndarray = cv2.dilate(threshold_ndarray, None, iterations=2)
contour_list = cv2.findContours(threshold_ndarray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
copy_image_ndarray = second_image_ndarray.copy()
for contour in contour_list:
if cv2.contourArea(contour) < 2000:
continue
else:
x1, y1, w, h = cv2.boundingRect(contour)
x2, y2 = x1 + w, y1 + h
leftTop_coordinate = x1, y1
rightBottom_coordinate = x2, y2
bgr_color = (0, 0, 255)
thickness = 2
cv2.rectangle(copy_image_ndarray, leftTop_coordinate, rightBottom_coordinate, bgr_color, thickness)
time_string = get_timeString()
text = '在时刻%s 发现运动物体! x=%d, y=%d' %(time_string, x1, y1)
print(text)
time_string = get_timeString()
bgr_color = (0, 0, 255)
thickness = 2
cv2.putText(copy_image_ndarray, time_string, (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)
return copy_image_ndarray
def show_image(image_ndarray):
windowName = 'display'
cv2.imshow(windowName, image_ndarray)
from sys import exit
if __name__ == '__main__':
device_list = mvsdk.CameraEnumerateDevice()
if len(device_list) == 0:
print('没有连接MindVision品牌的相机设备')
exit()
device_info = device_list[0]
cameraIndex = mvsdk.CameraInit(device_info, -1, -1)
first_image_ndarray = None
while True:
second_image_ndarray = get_capturedImage(cameraIndex)
drawed_image_ndarray = get_drawedDetectedImage(first_image_ndarray, second_image_ndarray)
if drawed_image_ndarray is not None:
show_image(drawed_image_ndarray)
pressKey = cv2.waitKey(1)
if 27 == pressKey or ord('q') == pressKey:
cv2.destroyAllWindows()
break
first_image_ndarray = second_image_ndarray
mvsdk.CameraUnInit(cameraIndex)
import cv2
import time
import os
def get_processedImage(image_ndarray):
image_ndarray_1 = cv2.cvtColor(image_ndarray, cv2.COLOR_BGR2GRAY)
filter_size = 21
image_ndarray_2 = cv2.GaussianBlur(image_ndarray_1, (filter_size, filter_size), 0)
return image_ndarray_2
import time
def get_timeString():
now_timestamp = time.time()
now_structTime = time.localtime(now_timestamp)
timeString_pattern = '%Y %m %d %H:%M:%S'
now_timeString = time.strftime(timeString_pattern, now_structTime)
return now_timeString
def get_drawedDetectedImage(first_image_ndarray, second_image_ndarray):
if second_image_ndarray is None or first_image_ndarray is None:
return None
first_image_ndarray_2 = get_processedImage(first_image_ndarray)
second_image_ndarray_2 = get_processedImage(second_image_ndarray)
absdiff_ndarray = cv2.absdiff(first_image_ndarray_2, second_image_ndarray_2)
threshold_ndarray = cv2.threshold(absdiff_ndarray, 25, 255, cv2.THRESH_BINARY)[1]
dilate_ndarray = cv2.dilate(threshold_ndarray, None, iterations=2)
contour_list = cv2.findContours(threshold_ndarray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
copy_image_ndarray = second_image_ndarray.copy()
height, width, _ = copy_image_ndarray.shape
contour_minArea = int(height * width * 0.001)
for contour in contour_list:
if cv2.contourArea(contour) < contour_minArea:
continue
else:
x1, y1, w, h = cv2.boundingRect(contour)
x2, y2 = x1 + w, y1 + h
leftTop_coordinate = x1, y1
rightBottom_coordinate = x2, y2
bgr_color = (0, 0, 255)
thickness = 2
cv2.rectangle(copy_image_ndarray, leftTop_coordinate, rightBottom_coordinate, bgr_color, thickness)
time_string = get_timeString()
text = '在时刻%s 发现移动物体! x=%d, y=%d' %(time_string, x1, y1)
print(text)
time_string = get_timeString()
bgr_color = (0, 0, 255)
thickness = 2
cv2.putText(copy_image_ndarray, time_string, (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1, bgr_color, thickness)
return copy_image_ndarray
from sys import exit
if __name__ == '__main__':
cameraIndex = 0
camera = cv2.VideoCapture(cameraIndex)
is_successful, first_image_ndarray = camera.read()
if not is_successful:
print("相机未成功连接,可能原因:1.相机不支持cv2库直接调用;2.如果有多个相机,设置正确的cameraIndex")
exit()
while True:
is_successful, second_image_ndarray = camera.read()
windowName = 'cv2_display'
drawed_image_ndarray = get_drawedDetectedImage(first_image_ndarray, second_image_ndarray)
cv2.imshow(windowName, drawed_image_ndarray)
pressKey = cv2.waitKey(1)
if 27 == pressKey or ord('q') == pressKey:
cv2.destroyAllWindows()
break
first_image_ndarray = second_image_ndarray
camera.release()