使用openCV提取sift;surf;hog特征

cv2.SIFT()

cv2.SURF()

cv2.HOGDescriptor()


使用cv2.SIFT的一个样例:(cv2.SURF使用与之类似)

#coding=utf-8  
import cv2  
import scipy as sp  
  
img1 = cv2.imread('x1.jpg',0) # queryImage  
img2 = cv2.imread('x2.jpg',0) # trainImage  
  
# Initiate SIFT detector  
sift = cv2.SIFT()  
  
# find the keypoints and descriptors with SIFT  
kp1, des1 = sift.detectAndCompute(img1,None)  
kp2, des2 = sift.detectAndCompute(img2,None)  
  
# FLANN parameters  
FLANN_INDEX_KDTREE = 0  
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)  
search_params = dict(checks=50)   # or pass empty dictionary  
flann = cv2.FlannBasedMatcher(index_params,search_params)  
matches = flann.knnMatch(des1,des2,k=2)  
  
print 'matches...',len(matches)  
# Apply ratio test  
good = []  
for m,n in matches:  
    if m.distance < 0.75*n.distance:  
        good.append(m)  
print 'good',len(good)  
# #####################################  
# visualization  
h1, w1 = img1.shape[:2]  
h2, w2 = img2.shape[:2]  
view = sp.zeros((max(h1, h2), w1 + w2, 3), sp.uint8)  
view[:h1, :w1, 0] = img1  
view[:h2, w1:, 0] = img2  
view[:, :, 1] = view[:, :, 0]  
view[:, :, 2] = view[:, :, 0]  
  
for m in good:  
    # draw the keypoints  
    # print m.queryIdx, m.trainIdx, m.distance  
    color = tuple([sp.random.randint(0, 255) for _ in xrange(3)])  
    #print 'kp1,kp2',kp1,kp2  
    cv2.line(view, (int(kp1[m.queryIdx].pt[0]), int(kp1[m.queryIdx].pt[1])) , (int(kp2[m.trainIdx].pt[0] + w1), int(kp2[m.trainIdx].pt[1])), color)  
  
cv2.imshow("view", view)  
cv2.waitKey()  

 
cv2.HOGDescriptor()的例子:还可以参考:https://www.programcreek.com/python/example/84776/cv2.HOGDescriptor
def createTrainingInstances(self, images):
		start = time.time()
		hog = cv2.HOGDescriptor()
		instances = []
		for img, label in images:
			# print img
			img = read_color_image(img)
			img = cv2.resize(img, (128, 128), interpolation = cv2.INTER_AREA)
			descriptor = hog.compute(img)
			if descriptor is None:
				descriptor = []
			else:
				descriptor = descriptor.ravel()
			pairing = Instance(descriptor, label)
			instances.append(pairing)
		end = time.time() - start
		self.training_instances = instances
		print "HOG TRAIN SERIAL: %d images -> %f" % (len(images), end) 
def createTestingInstances(self, images):
		start = time.time()
		hog = cv2.HOGDescriptor()
		instances = []
		for img, label in images:
			# print img
			img = read_color_image(img)
			img = cv2.resize(img, (128, 128), interpolation = cv2.INTER_AREA)
			descriptor = hog.compute(img)
			if descriptor is None:
				descriptor = []
			else:
				descriptor = descriptor.ravel()
			pairing = Instance(descriptor, label)
			instances.append(pairing)
		end = time.time() - start
		self.testing_instances = instances
		print "HOG TEST SERIAL: %d images -> %f" % (len(images), end) 


还有:

def get_hog(image):
    # winSize = (64,64)
    winSize = (image.shape[1], image.shape[0])
    blockSize = (8,8)
    # blockSize = (16,16)
    blockStride = (8,8)
    cellSize = (8,8)
    nbins = 9
    derivAperture = 1
    winSigma = 4.
    histogramNormType = 0
    L2HysThreshold = 2.0000000000000001e-01
    gammaCorrection = 0
    nlevels = 64
    hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma,
                            histogramNormType,L2HysThreshold,gammaCorrection,nlevels)
    #compute(img[, winStride[, padding[, locations]]]) -> descriptors
    winStride = (8,8)
    padding = (8,8)
    locations = [] # (10, 10)# ((10,20),)
    hist = hog.compute(image,winStride,padding,locations)
    return hist

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV中有很多不同的特征提取算法,以下是其中一些常见的算法: 1. SIFT(尺度不变特征变换):SIFT是一种基于尺度空间的特征提取算法,它能够在不同的尺度空间上检测出关键点,并提取出描述符。SIFT算法主要用于图像匹配、目标跟踪和三维重建等领域。 2. SURF(加速稳健特征):SURF是一种基于SIFT算法的改进版,它使用了一些加速技术来提高计算速度。SURF算法在SIFT算法的基础上进行了优化,提高了算法的效率和稳健性。 3. ORB(旋转不变性二进制特征):ORB是一种基于FAST特征检测器和BRIEF描述符的特征提取算法,它具有旋转不变性和尺度不变性。ORB算法在实时性和准确性方面都表现出色,适用于移动设备和嵌入式系统等低功耗场景。 4. HOG(方向梯度直方图):HOG是一种基于图像梯度方向直方图的特征提取算法,它通常用于目标检测和行人识别等领域。HOG算法可以提取出图像中物体的形状和纹理信息,并且具有一定的旋转不变性。 5. LBP(局部二值模式):LBP是一种基于局部像素点的二值模式描述符,它可以用于图像分类、人脸识别和纹理分析等领域。LBP算法对图像的灰度值进行二值化处理,并统计局部像素点的特征,从而提取出图像的纹理信息。 以上是常见的几种特征提取算法,不同的算法适用于不同的场景和应用。在使用时需要根据实际需求选择合适的算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值