PCV库之调用SIFT.py中process_image()执行错误的解决方案

背景介绍:

windows10,python3.x,64位AMD R9处理器,ROG电脑,pycharm开发,已经安装好了PCV库

如何安装PCV库 请看我的博客Python之PCV库安装教程以及解说-CSDN博客文章浏览阅读111次,点赞5次,收藏3次。GitHub - Ultravioletrayss/PCVfile: 文档内含有python2 和python3的文件 一定要区分下载 Files containing Python 2 and Python 3 in the document must be downloaded separately。这样就是安装成功了 但是有些同学可能python setup.py install后没有任何反应 就像下面这张图一样(因为我一开始就是)下载的时候请对应好版本进行下载,具体内容我已经上传github中。https://blog.csdn.net/Ultravioletrays/article/details/138196025?spm=1001.2014.3001.5501

前置import代码如下 涉及到的库有:

# coding: utf-8
import math
import pickle
import sys
from matplotlib.pylab import *
from matplotlib import cbook, mlab, pyplot as plt
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import pygame, pygame.image
from pygame.locals import *
from PCV.geometry import homography, camera
from PCV.localdescriptors import sift
import matplotlib

 

在使用PCV库的SIFT文件时候,有这样几行代码一直报错,就是process_image这个函数

具体报错:

Traceback (most recent call last):
  File "C:\Users\ultra\Desktop\壶子.py", line 133, in <module>
    l0, d0 = sift.read_features_from_file('im0.sift')
  File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\pcv-1.0-py3.9.egg\PCV\localdescriptors\sift.py", line 29, in read_features_from_file
  File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib\npyio.py", line 1373, in loadtxt
    arr = _read(fname, dtype=dtype, comment=comment, delimiter=delimiter,
  File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib\npyio.py", line 992, in _read
    fh = np.lib._datasource.open(fname, 'rt', encoding=encoding)
  File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib\_datasource.py", line 193, in open
    return ds.open(path, mode, encoding=encoding, newline=newline)
  File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib\_datasource.py", line 533, in open
    raise FileNotFoundError(f"{path} not found.")
FileNotFoundError: im0.sift not found.

大概就是说

这个文件没有生成出来,一看我的项目结构 确实没有

于是定位问题到sift.process_image这个函数中.

def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"):
    """ Process an image and save the results in a file. """

    if imagename[-3:] != 'pgm':
        # create a pgm file
        im = Image.open(imagename).convert('L')
        im.save('tmp.pgm')
        imagename = 'tmp.pgm'

    cmmd = str("sift "+imagename+" --output="+resultname+
                " "+params)
    status=os.system(cmmd)
    if status != 0:
        print("命令执行失败,状态码:", status)
    else:
        print("命令执行成功")
    print('processed', imagename, 'to', resultname)

 上面就是核心代码,我对这段代码进行了修改 原始的代码如下图所示

def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"):
    """ Process an image and save the results in a file. """

    if imagename[-3:] != 'pgm':
        # create a pgm file
        im = Image.open(imagename).convert('L')
        im.save('tmp.pgm')
        imagename = 'tmp.pgm'

    cmmd = str("sift "+imagename+" --output="+resultname+
                " "+params)
    os.system(cmmd)
    print('processed', imagename, 'to', resultname)

我增加了对于os.system语句的判定检查,从而定位到了错误就是这里. 

    cmmd = str("sift "+imagename+" --output="+resultname+
                " "+params)
    status=os.system(cmmd)

这两个语句发生了问题 os.system没有执行成功.

于是我在网上开始查找资料 找了半天 找到了一个

SIFT特征提取与检索_"cmmd = str(“sift \" + imagename + \" --output=” +-CSDN博客文章浏览阅读400次。1.前言所谓局部特征描述算子(SIFT)就是用来刻画图像中的这些局部共性的,而我们也可以将一幅图像映射(变换)为一个局部特征的集合。理想的局部特征应具有平移、缩放、旋转不变性,同时对光照变化、仿射及投影影响也应有很好的鲁棒性。传统的局部特征往往是直接提取角点或边缘,对环境的适应能力较差。SIFT针对局部特征进行特征提取,在尺度空间寻找极值点,提取位置,尺度,旋转不变量,生成特征描述子。SI..._"cmmd = str(“sift \" + imagename + \" --output=” + resultname + \" \" + params)"https://blog.csdn.net/qq_41634240/article/details/104649845简单来说就是要往你的项目里面导入几个文件即可

原因是:需要使用开源工具包VLFeat提供的二进制文件来计算图像的SIFT特征

                                                        打开下面网址进行下载VLFeat - Homeicon-default.png?t=N7T8https://www.vlfeat.org/

 页面如下:

下载完毕后 解压 或者直接打开压缩包 找到bin文件目录

注意系统版本我们一般都是win64 不用打开其他的maci或者glnxa64.

然后我们只需要三个文件vl.dll和sift.exe和vl.lib 复制到我们的项目文件里面去 如下图所示

然后就能运行了!

1) 二值图像: 一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。 2) 灰度图像: 灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。 3) 索引图像: 索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。 4) RGB彩色图像: RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。 4.图像数字化 通过取样和量化过程将一个以自然形式存在的图像变换为适合计算机处理的数字形式。图像在计算机内部被表示为一个数字矩阵,矩阵中每一元素称为像素。图像数字化需要专门的设备,常见的有各种电子的和光学的扫描设备,还有机电扫描设备和手工操作的数字化仪。图像编码。 对图像信息编码,以满足传输和存储的要求。编码能压缩图像的信息量,但图像质量几乎不变。为此,可以采用模拟处理技术,在通过模-数转换得到编码,不过多数是采用数字编码技术。编码方法有对图像逐点进行加工的方法,也有对图像施加某种变换或基于区域、特征进行编码的方法。脉码调制、微分脉码调制、预测码和各种变换都是常用的编码技术。 5.图像压缩 由数字化得到的一幅图像的数据量十分巨大,一幅典型的数字图像通常由500×500或1000×1000个像素组成。如果是动态图像,是其数据量更大。因此图像压缩对于图像的存储和传输都十分必要。 有两类压缩算法,即不失真的方法和近似的方法。最常用的不失真压缩取空间或时间上相邻像素值的差,再进行编码。游程码就是这类压缩码的例子。近似压缩算法大都采用图像交换的途径,例如对图像进行快速傅里叶变换或离散的余弦变换。著名的、已作为图像压缩国际标准的JPEG和MPEG均属于近似压缩算法。前者用于静态图像,后者用于动态图像。它们已由芯片实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杨骅麟(Hadrain Young)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值