___sakura___ 2020-06-20 10:10 采纳率: 0%
浏览 796

opencv检测里遇到的setSVMDetector()问题

  • 我的程序想将opencv行人检测迁移到别的检测中,但是我的图片是1:1,无法分解到3780维,请问这种有什么解决方法吗?

  • 能否直接更改setSVMDetector()的默认参数3780维?

  • 还是说可以更改图片大小,但我期望的原图仍要保持1:1的比例,分解3780只能得到

    3780 = 2*2*3*5*7*9      # 9是9个bin
    

    贴一段自己的检测代码

PosNum = 1997  # 有1997张正样本
NegNum = 1931
winSize = (20, 20)  # 窗口刚好就是一张图的大小
blockSize = (10, 10)  # 有4个块
blockStride = (5, 5)  # 块步长5,5
cellSize = (5, 5)  # 有4个cell
nBin = 9  # 9个bin 一共3780维是opencv固定的
# 创建hog对象
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nBin)
# 创建svm对象
svm = cv2.ml.SVM_create()
# 计算hog
# 设置特征维度
featureNum = int(((20-10)/5+1)*((20-10)/5+1)*4*9)  # 324就不符合3780
# 初始化特征数组
featureArray = np.zeros(((PosNum+NegNum), featureNum), np.float32)  # 二维数组,通过ij访问
# 初始化标签数组
labelArray = np.zeros(((PosNum+NegNum), 1), np.int32)
# svm 监督学习 样本 标签
for i in range(0, PosNum):
    fileName = r'pic_pos\\'+str(i+1)+'.jpg'
    img = cv2.imread(fileName)  # 图片加载
    hist = hog.compute(img, (5, 5))  # 计算hog
    for j in range(0, featureNum):
        featureArray[i, j] = hist[j]
    labelArray[i, 0] = 1
for i in range(0, NegNum):
    fileName = r'pic_neg\\' + str(i + 1) + '.jpg'
    img = cv2.imread(fileName)  # 图片加载
    hist = hog.compute(img, (2, 2))  # 计算hog
    for j in range(0, featureNum):
        featureArray[i+PosNum, j] = hist[j]
    labelArray[i+PosNum, 0] = -1
# 负样本label=-1
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(0.01)
# 训练
ret = svm.train(featureArray, cv2.ml.ROW_SAMPLE, labelArray)
# 检测
# rho是svm得到的hog描述信息(不详细讨论)
alpha = np.zeros((1), np.float32)  # 一行一列数组
rho = svm.getDecisionFunction(0, alpha)  # get方法获取rho
print(rho)
print(alpha)
alphaArray = np.zeros((1, 1), np.float32)   # 大小1*1
supportVArray = np.zeros((1, featureNum), np.float32)  # 1*featureNum
resultArray = np.zeros((1, featureNum), np.float32)  # 1*featureNum
alphaArray[0, 0] = alpha
resultArray = -1*alphaArray*supportVArray
# 检测
myDetect = np.zeros((325), np.float32)  # 放检测结果
# myDetect = np.zeros((8101), np.uint8)  # 放检测结果 我怀疑是灰度图uint8导致,因为源程序是rgb彩色图片
for i in range(0, 324):
    myDetect[i] = resultArray[0, i]  # 前3780来自resultArray[0,i]
    # print(i, myDetect[i])
myDetect[324] = rho[0]  # 最后一位来自rho[0]
# 构建hog(重要 )
myHog = cv2.HOGDescriptor()
myHog.setSVMDetector(myDetect)  # 把myDetect属性传到myHog
imageSrc = cv2.imread('s2.jpg', 0)  # 读取待检测图片,2:彩色图片1,灰度图0
objs = myHog.detectMultiScale(imageSrc, 0, (5, 5), (20, 20), 1.05, 2)  # 对应目标的检测

x = int(objs[0][0][0])
y = int(objs[0][0][1])
w = int(objs[0][0][2])
h = int(objs[0][0][3])
cv2.rectangle(imageSrc, (x, y), (x+w, y+h), (255, 0, 0), 2)  # 绘制矩形框
cv2.imshow('dst', imageSrc)  # 最终结果展示
cv2.waitKey(0)

补充说明:
程序运行后出现error: (-215) checkDetectorSize() in function cv::HOGDescriptor::setSVMDetector
报错行69 myHog.setSVMDetector(myDetect) # 把myDetect属性传到myHog,目前我的猜测报错是因为维数问题,所以想着如何去更改维度

  • 写回答

3条回答 默认 最新

  • 吃芒果的鱼 2021-03-29 16:35
    关注

    第59行,不设置参数的话当然是默认的3780维,要设置自己的参数

    评论

报告相同问题?

悬赏问题

  • ¥15 全志H618ROM新增分区
  • ¥20 jupyter保存图像功能的实现
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况