OpenCV 초기 시도 1 - 이미지 및 비디오 로드 및 표시

1. 이미지 및 비디오 로드 및 표시

저 역시 OpenCV 초심자이고 파이썬 기초조차 미흡하기 때문에(이전에 자바를 배운 적이 있습니다) 1회 내용은 비교적 기초적인 내용입니다.
물론 먼저 OpenCV 환경을 준비해야 하는데, 일반적으로 B국의 OpenCV 동영상에 소개되어 있으므로 여기서는 자세히 설명하지 않겠습니다.

1.1 윈도우 생성 및 디스플레이 윈도우

일반적으로 사용되는 API:
(함수는 기본적으로 C++ 명명 규칙, 혹 구조)

  • cv2.namedWindow(winname[, flags]): 명명된 창을 만듭니다.
  • cv2.imshow(winname,mat): 디스플레이 창
  • cv2.destroyAllWindows(): 모든 창 파괴
  • cv2.resizeWindow(winname, width, height): 창 크기 변경
  • cv2.waitKey([, 지연]): 사용자 입력 대기
#虽然OpenCV名字叫这个,但是初始时候叫做cv2,便一直沿用至今
import cv2


#创建窗口,winname为你命名的窗口名称,中括号里面的表示可以不写,系统会给默认值
#这里说明两个选择:
#1.cv2.WINDOW_NORMAL :你可以改变你的窗口大小
#2.cv2.WINDOW_AUTOSIZE:系统自动地把窗口大小设置成你图片的大小
#不写就默认第二种
cv2.namedWindow('window')

#更改窗口大小,注意想要更改窗口大小需要为第一种flag
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 800, 600)

#展示名字为window的窗口
cv2.imshow('window', 0)

#等待按键,括号内为等待时间,毫秒级,0表示任意键终止,会返回按键的ASCII值
#计算字母的ASCII值
#ord('q')
cv2.waitKey(0)

#可以使用waitKey来销毁窗口
key = cv2.waitKey(0)
#& 0xFF非必要,完全可以不写,key是int型,最少是16位,而ASCII码是8位
if key & 0xFF == ord('q'):
	cv2.destroyAllWindows()

1.2 로드 표시 사진

  • cv2.imread(filename[, flags]): 그림 읽기, 기본적으로 컬러 그림 읽기
    OpenCV에서 읽은 그림의 색상 채널은 BGR입니다.
  • 일반적으로 사용되는 세 가지 플래그가 있습니다.
  • cv2.IMREAD_COLOR: 컬러 이미지, 알파 채널 무시
  • cv2.IMREAD_GRAYSCALE: 회색조 이미지
  • cv2.IMREAD_UNCHANGED: 알파 채널을 포함하여 전체 그림에서 읽습니다.
import cv2
import matplotlib.pyplot as plt
import numpy as np


#读取图片,绝对路径和相对路径都可以,flags后文再提
img = cv2.imread('./img.jpg')
#matplotlib显示图片,但我们会发现matplotilb显示的颜色和真实图片不一样,因为OpenCV读进来的图片数据的颜色通道不是默认的RGB,而是BGR(蓝绿红),所以一般用OpenCV自己的方式展示图片
plt.imshow(img)
cv2.imshow('img', img)

1.3 사진 저장

  • cv2.imwrite(파일 이름, img[, 매개변수])
import cv2


#其实正常完全可以省去这两步,但是为了联系上面的只是还是写一下 吧
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 320, 240)

img = cv2.imread('./img.jpg')

#利用while循环优化退出逻辑
while True:
	cv2.imshow('img', img)
	key = cv2.waitKey(0)
	if(key & 0xFF == ord('q')):
		break
	elif(key & 0xFF == ord('s'):
		#是可以对你想保存的图片进行重命名和改变图片格式
		cv2.imwrite("./img2.png", img)
	elif:
		print(key)
cv2.destrpyAllWindows()

1.4 비디오 캡처

  • 동영상은 사진으로 구성되어 있는데, 동영상의 각 프레임은 사진으로 보통 30프레임으로 1초에 30장의 사진이 표시됩니다.
  • cv2.VideoCapture(): 카메라를 캡처하고 숫자를 사용하여 0, 1과 같은 다양한 장치를 나타낼 수 있습니다.
  • 참고: 여기서 VideoCapture는 클래스이므로 첫 글자가 대문자입니다.
  • 동영상 파일인 경우 경로를 직접 지정하면 됩니다.
#打开视频文件
vc = cv2.VideoCapture('./1.mp4')

#打开摄像头,如果打开失败,不会报错,看起来是闪退
vc = cv2.VideoCapture(0)
  • 제대로 열렸는지 확인
if vc.isOpened():
	#读取视频的一帧,返回标记和这一帧数据,open为True表示读到了数据,为false表示没读到数据
	open, frame = vc.read()
else:
	open = False
  • 비디오 데이터의 각 프레임을 읽는 루프
while True:
	#可以读到内容ret返回True
	ret, frame = vc.read()
	
	if not ret:
		#没读到数据,直接退出
		break
	#显示数据
	cv2.imshow('video', frame)
	
	#假如一个视频是30帧,我们每张图间要间隔1000//30秒,注意必须是整数
	key = cv2.waitKey(1000//30)
	if key == ord('q'):
		break
#释放资源
vc.release()
cv2.destroyAllWindows()

1.5 비디오 녹화

  • cv2.VIdeoWriter(): 첫 번째 매개변수는 출력 파일, 두 번째 매개변수는 멀티미디어 파일 형식(VideoWriter_fourcc), 세 번째 매개변수는 프레임 속도, 네 번째 매개변수는 해상도입니다.
  • 쓰기: 캐시에 인코딩 및 쓰기
  • 릴리스: 캐시 콘텐츠가 디스크에 기록되고 리소스가 릴리스됩니다.
cap = cv2.VideoCapture(0)
#*mp4v就是解包操作,等同于 'm', 'p', '4', 'v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
#(640, 480)表示摄像头拍视频,这个大小不能错
#主要是这个分辨率

vm = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))

while cap.isOpened():
	ret, frame = cap.read()
	if not ret:
		break
	vm.write(frame)
	cv2.imshow('frame', frame)
	
	if cv2.waitKey(10) == ord('q'):
		break
cap.release()

#释放VideoWriter
vm.release()

cv2.destroyAllWindows()

자, 여기서 첫 번째 부분을 먼저 마치겠습니다(컴퓨터 화면을 응시하기에는 너무 피곤합니다=.=).

추천

출처blog.csdn.net/m0_59021811/article/details/123882770