Установка и настройка распознавания лиц при помощи OpenCV за полчаса

Неудача при тестировании OpenCV на Raspberry Pi Zero W (офигенные тормоза в работе) заставила искать иные пути. Поставил Ubuntu второй системой на свой старый ноут , накатил pip3 и с его помощью установил OpenCV. Устанавливается все просто:

sudo apt-get -y install python3-pip
pip3 install opencv-contrib-python

Затем устанавливаем пакет face recognition и следуем инструкциям установщика:

pip3 install face_recognition

Также  клонируем гит в заранее созданную папку

git clone https://github.com/ageitgey/face_recognition
И все.

Подробности использования пакета по ссылке https://github.com/ageitgey/face_recognition

Моей целью было распознавание лиц в видеопотоке с вебкамеры ноута. Идем в папку examples, куда положим фотографии образцы нужных лиц. В это папке есть файл кода Python, настроенный  для распознавания Обамы и Байдена

facerec_from_webcam_faster.py

Мы создаем его копию facerec_from_webcam_faster_your_copy.py и редактируем вот эти куски в соответствии с нашими фото-примерами. При необходимости добавления более двух лиц добавляем куски кода.

# Load a sample picture and learn how to recognize it.
obama_image = face_recognition.load_image_file(«obama.jpg»)
obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

# Load a second sample picture and learn how to recognize it.
biden_image = face_recognition.load_image_file(«biden.jpg»)
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

 

Сохраняем и запускаем скрипт командой

pip3 facerec_from_webcam_faster_your_copy.py

В результате имеем поток с наложением рамки и текста с распознанными лицами

ezgif-1-d682729d1324

Код на Python для вставки блока в точку со смещением относительно координат Мтекста

Первая программа берет координаты у выделенного Мтекста и блоков и вычисляет дельту между координатами вставки Мтекста и блоков. Результаты пишет в файл.

 

# coding: utf-8
import System
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
aDoc = app.ActiveDocument
mSp = aDoc.ModelSpace
sset = aDoc.PickfirstSelectionSet


text = []
block1=[]
point=[]
block3=[]
block4=[]


for i in sset:	
	if i.ObjectName == 'AcDbMText':
		text=i.insertionPoint
		print 'точка вставки текста',text		
		
for i in sset:		
	if i.ObjectName == 'AcDbBlockReference':		
		block1=i.insertionPoint
		print 'точка вставки блока',block1
		print 'дельта х', text[0]-block1[0]
		point.append(text[0]-block1[0])
		print 'дельта y', text[1]-block1[1]
		point.append(text[1]-block1[1])
		
print point

f = open( 'POINT.txt', 'wr' )
for i in iter(point):
	print i
	f.write(str(i))
	f.write(' ')
f.close()
	
	

Вторая программа читает данные из файла и вставляет столько же блоков с теми же координатами относительно выделенного МТекста

# coding: utf-8
import System
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
aDoc = app.ActiveDocument
mSp = aDoc.ModelSpace
sset = aDoc.PickfirstSelectionSet


def ptA(p,x1,y1):
	return System.Array[float]([p[0], p[1], p[2], p[0]+x1, p[1]+y1, p[2]])
#print elems[0].ObjectName
#print elems[0].Layer
#print dir ()
text = []
block1=[]
point=[]
block3=[]
block4=[]
#print mSp.Count
n = int(1)

		
		
		
# for i in sset:		
	# if i.ObjectName == 'AcDbBlockReference':
		# print i.Name
		# block1=i.insertionPoint
		# print 'точка вставки блока',block1
		# print 'дельта х', text[0]-block1[0]
		# point.append(text[0]-block1[0])
		# print 'дельта y', text[1]-block1[1]
		# point.append(text[1]-block1[1])
		# n=n+1
# print point

#sset1=aDoc.SelectionSets.Add
#returnObj = aDoc.Utility.GetEntity(sset1, 'Select objects')

f = open( 'POINT.txt', 'r' )
lst = f.readlines()
#print lst
# for i in iter(ftext):
	# print i
	# f.write(str(i))
	# f.write(' ')
f.close()
with open( 'POINT.txt', 'r' ) as file:
    string = file.read()
#del lst[0]
#print lst
lst = [float(n) for n in string.split()] 
print lst	

#print lst[0]
for i in sset:
	#print i.Name
	if i.ObjectName == 'AcDbMText':
		#print dir(i)
		text=i.insertionPoint
		#print 'точка вставки текста',text
		#print int((int(i.TextString[0])/2))+1
		text[0]=text[0]-lst[0]
		#print len(lst)
		n = 1
		print round(7/2)
		delta=lst[1]-lst[3]
		text[1]=text[1]-lst[7]
		print text[1]
		for i in range(1,int(i.TextString[0])+1,2):			
			print i
			print n
			print float(lst[n*2-1])
			text[1]=text[1]-delta
			mSp.InsertBlock(text, 'РОН-2',1,1,1,0,[])	
			#n=n+1
			print text[1]


			

Простой код на Python, позволяющий заменить блок в чертеже AutoCAD

Работает в IronPython 2.7 c COM API. Код заменяет блок «РОН-2» на блок «радиорозетка» со смещением точки вставки.

# coding: utf-8
import System
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
aDoc = app.ActiveDocument
mSp = aDoc.ModelSpace
sset = aDoc.PickfirstSelectionSet
text = []
for i in sset:
	if i.ObjectName == 'AcDbBlockReference':
		if i.Name == 'РОН-2':
			text=i.insertionPoint
			print text
			text[0]=text[0]-3.0088
			text[1]=text[1]+2.9133
			mSp.InsertBlock(text, 'радиорозетка',1,1,1,0,[])			
			i.Erase())