新闻动态

python opencv通过按键采集图片源码

发布日期:2022-06-04 14:24 | 文章来源:站长之家

一、python版本

写了个python opencv的小demo,可以通过键盘按下字母s进行采集图像。

功能说明

“N” 新建文件夹 data/ 用来存储图像
“S” 开始采集图像,将采集到的图像放到 data/ 路径下
“Q” 退出窗口

python opencv源码

'''
“N”  新建文件夹 data/  用来存储图像
"S"开始采集图像,将采集到的图像放到 data/ 路径下
“Q”退出窗口
'''
import numpy as np  # 数据处理的库 Numpy
import cv2 # 图像处理的库 OpenCv
import os  # 读写文件
import shutil # 读写文件
from PIL import Image, ImageDraw, ImageFont

# # OpenCv 调用摄像头 / Use camera
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,1080)
'''
#功能函数,只是用来往图片中显示汉字
#示例 img = cv2ImgAddText(cv2.imread('img1.jpg'), "大家好,我是片天边的云彩", 10, 65, (0, 0, 139), 20)
参数说明:
img:OpenCV图片格式的图片
text:要写入的汉字
left:字符坐标x值
top:字符坐标y值
textColor:字体颜色
:textSize:字体大小
'''
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
 if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
  img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
 # 创建一个可以在给定图像上绘图的对象
 draw = ImageDraw.Draw(img)
 # 字体的格式
 fontStyle = ImageFont.truetype(
  "font/simsun.ttc", textSize, encoding="utf-8")
 # 绘制文本
 draw.text((left, top), text, textColor, font=fontStyle)
 # 转换回OpenCV格式
 return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
# 存储图像的文件夹 
current_dir = ""
# 保存  图像 的路径 
path_photos_from_camera = "data/"
press_n_flag = 0
cnt_ss=0

while cap.isOpened():
 flag, img_rd = cap.read()
 #print(img_rd.shape)
 kk = cv2.waitKey(2)
 # 待会要写的字体 / Font to write
 font = cv2.FONT_ITALIC
 # 4. 按下 'n' 新建存储人脸的文件夹 / press 'n' to create the folders for saving faces
 if kk == ord('N') or kk == ord('n'):
  current_dir = path_photos_from_camera
  #os.makedirs(current_dir)
  if os.path.isdir(current_dir):
pass
  else:
os.mkdir(current_dir)
  print('\n')
  print("新建的保存图像的文件夹 / Create folders: ", current_dir)
  press_n_flag = 1  # 已经按下 'n' / have pressed 'n'

 # 5. 按下 's' 保存摄像头中的图像到本地 / Press 's' to save image into local images
 if kk == ord('S') or kk == ord('s'):
  # 检查有没有先按'n'新建文件夹 / check if you have pressed 'n'
  if press_n_flag:
cnt_ss += 1
cv2.imwrite(current_dir + "/img_" + str(cnt_ss) + ".jpg", img_rd)
print("写入本地 / Save into:", str(current_dir) + "/img_face_" + str(cnt_ss) + ".jpg")
  else:
print("请在按 'S' 之前先按 'N' 来建文件夹 / Please press 'N' before 'S'")

 # 添加说明 / Add some statements
 #cv2.putText(img_rd, "Face Register", (20, 40), font, 1, (0, 255, 0), 1, cv2.LINE_AA)
 img_rd = cv2ImgAddText(img_rd, "图片采集系统", 160, 25, (0, 255,0), 30)
 #cv2.putText(img_rd, "N: Create face folder", (20, 350), font, 0.8, (0, 255, 0), 1, cv2.LINE_AA)
 img_rd = cv2ImgAddText(img_rd, "N: 创建保存图像文件夹", 20, 350, (0, 255, 0), 20)
 #cv2.putText(img_rd, "S: Save current face", (20, 400), font, 0.8, (0, 255, 0), 1, cv2.LINE_AA)
 img_rd = cv2ImgAddText(img_rd, "S: 保存当前图片", 20, 400, (0, 255, 0), 20)
 #cv2.putText(img_rd, "Q: Quit", (20, 450), font, 0.8, (0, 0, 0), 1, cv2.LINE_AA)
 img_rd = cv2ImgAddText(img_rd, "Q: 退出", 20, 450, (0, 255, 0), 20)
 # 6. 按下 'Q' 键退出 / Press 'q' to exit
 if kk == ord('Q') or kk == ord('q'):
  break
 # 如果需要摄像头窗口大小可调 / Uncomment this line if you want the camera window is resizeable
 cv2.namedWindow("camera", 0)
 cv2.imshow("camera", img_rd)
# 释放摄像头 / Release camera and destroy all windows
cap.release()
cv2.destroyAllWindows()

效果图

安装相关库

windows安装

pip install pillow

tx2/linux/…

sudo apt-get install python3-pillow

二、c语言版本

c语言源码

/*****************************************************
2021.5.18:按键采集图像
******************************************************/
#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <fstream> 
using namespace cv;
using namespace std;
#define SRC_WIDTH  1920
#define SRC_HEIGHT 1080
int main()
{
	//测试视频
	VideoCapture capture;
	capture.open(1);
	//capture.open("v4l2src device=/dev/video4 ! video/x-raw,width=1920,height=1020,framerate=30/1 ! videoconvert ! appsink");
	if (!capture.isOpened())
	{
		printf("文件打开失败");
	}
	capture.set(CAP_PROP_FRAME_WIDTH, SRC_WIDTH);  //设置宽度
	capture.set(CAP_PROP_FRAME_HEIGHT, SRC_HEIGHT);  //设置长度
	Mat frame;
	int n = 0;
	char* cstr = new char[120];
	while (true)
	{
		
		capture >> frame;
		if (frame.data == NULL)
		{
			printf("Image is empty\n");
			//writer.write(frame);
			break;
			//continue;
		}
		char kk=waitKey(2);
		if (kk == 'S' || kk == 's')
		{
			sprintf(cstr, "%s%d%s", "caliberation/", n++, ".jpg");
			imwrite(cstr, frame);
			printf("保存了图片\n");
		}
		
		namedWindow("111", 0);//参数为零,则可以自由拖动
		imshow("111", frame);
		waitKey(2);
	}
	return 0;
}

效果图

到此这篇关于opencv通过按键采集图片源码的文章就介绍到这了,更多相关opencv按键采集图片内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

香港快速服务器

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部