cv:imdecode 库在哪个盘库

利用Python和OpenCV库将URL转换为OpenCV格式的方法
利用Python和OpenCV库将URL转换为OpenCV格式的方法
时间:发表于
今天的博客是直接来源于我自己的个人工具函数库。
过去几个月,有些PyImageSearch读者电邮问我:“如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)”。这篇文章我将展示一下怎么实现这个功能。
额外的,我们也会看到如何利用scikit-image从URL下载一幅图像。当然前行之路也会有一个常见的错误,它可能让你跌个跟头。
继续往下阅读,学习如何利用利用Python和OpenCV将URL转换为图像
方法1:OpenCV、NumPy、urllib
第一个方法:我们使用OpenCV、NumPy、urllib库从URL获取图像,并将其转换为图像。打开并新建一个文件,取名url_to_image.py,我们开始吧:
# import the necessary packages
import numpy as np
import urllib
import cv2
# METHOD #1: OpenCV, NumPy, and urllib
def url_to_image(url):
# download the image, convert it to a NumPy array, and then read
# it into OpenCV format
resp = urllib.urlopen(url)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# return the image
return image
首先要做的就是导入我们必需的包。我们将使用NumPy转换下载的字节序为NumPy数组,使用urllib来执行实际的网络请求,使用cv2来绑定OpenCV接口。
在第7行,我们定义了我们的url_to_image函数。这个函数带一个url参数,也就是我们想要下载的图像地址。
接下来,在第10行,我们使用urllib库来打开这个图像链接。11行则将这个下载下来的字节序转换为NumPy数组。
至此,NumPy数组还是一个1维数组(也就是一个长长的像素链表)。为了将其转换为2维格式,假设每个像素3个通道(意即分别为红,绿,蓝通道),在12行我们使用cv.imdecode函数。最后,在15行我们返回解码出来的图像给调用函数。
一切就绪,该到让它工作的时候了:
# initialize the list of image URLs to download
"/wp-content/uploads/2015/01/opencv_logo.png",
"/wp-content/uploads/2015/01/google_logo.png",
"/wp-content/uploads/2014/12/adrian_face_detection_sidebar.png",
# loop over the image URLs
for url in urls:
# download the image URL and display it
print "downloading %s" % (url)
image = url_to_image(url)
cv2.imshow("Image", image)
cv2.waitKey(0)
3-5行定义了我们将要下载和转换为OpenCV格式的图像地址列表。
第9行我们遍历这个列表,13行则调用url_to_image函数,然后在14行和15行将获取的图像显示到屏幕上。到此呢,我们就可以像正常情况下一样,使用OpenCV来操作和处理这些图像了。
眼见为实,打开终端,执行如下指令:
代码如下: $ python url_to_image.py&
如果一切顺利的话,你会看到OpenCV的logo:
图1:从URL下载OpenCV logo并转换为OpenCV格式
接下来是Google的logo:
图2:从URL下载Gooogle并转换为OpenCV格式
这里也有在我书中验证人脸检测的例子,《》:
图3:转换一个URL图像为OpenCV格式
现在,我们来看另一种获取图像并转换为OpenCV格式的方法。
方法2:使用scikit-image
第二种方法假定你已经在你计算机上安装好了库。让我们看看怎样采用scikit-image从URL获取图像并将其转换为OpenCV格式:
# METHOD #2: scikit-image
from skimage import io
# loop over the image URLs
for url in urls:
# download the image using scikit-image
print "downloading %s" % (url)
image = io.imread(url)
cv2.imshow("Incorrect", image)
cv2.imshow("Correct", cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
cv2.waitKey(0)
库中做得很漂亮的一点是:io子库中的imread函数能够区分图像路径到底在磁盘上还是一个URL(第9行)。
尽管这样,这里有一个很严重的错误可能让你跌一个跟头!
OpenCV以BGR顺序表达一幅图像,然而scikit-image则是RGB顺序。如果你使用scikit-iamge的imread函数,而且还想在下载完成后使用OpenCV的函数,那么你要小心了。如41行所述,你需要将图像从RBG转换为BGR。
如果你没有这一步,那么你可能得到错误的结果:
图4:在用scikit-image时,需要特别注意将RGB转换为BGR。左边的图像就是不正确的RGB顺序,右边的则是将RGB转换为BGR,所以能正常显示。
看看Google的logo就更明显了
图5:顺序很重要。确保将RGB转换为BGR,否则就留下了一个很难发现的bug。
到此为止,你明白了吧!这两种方法分别使用Python、OpenCV、urllib,和scikit-image来将URL指向的图片转换为图像。
本文中,我们学会了如何从URL获取图像,且使用Python和OpenCV将其转换为OpenCV格式。
第一种方法使用urllib包获取图像,使用Numpy转换为数组,最后使用OpenCV重新构建数组产生我们的图像。
第二种方式使用scikit-image中的io.imread函数。
所以,哪种更好呢?
这完全取决于你的安装。
如果你已经安装scikit-image,那么我可能就用io.imread(只是不要忘记如果要用OpenCV函数的话,要将RGB转换为BGR)。
如果你没有安装scikit-image,那么url_to_image就是手边现成的工具。具体细节参考本文开始处。
我很快会在Github上将这个函数添加到库中。利用Python和OpenCV库将URL转换为OpenCV格式的方法
今天的博客是直接来源于我自己的个人工具函数库。
过去几个月,有些PyImageSearch读者电邮问我:“如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)”。这篇文章我将展示一下怎么实现这个功能。
额外的,我们也会看到如何利用scikit-image从URL下载一幅图像。当然前行之路也会有一个常见的错误,它可能让你跌个跟头。
继续往下阅读,学习如何利用利用Python和OpenCV将URL转换为图像
方法1:OpenCV、NumPy、urllib
第一个方法:我们使用OpenCV、NumPy、urllib库从URL获取图像,并将其转换为图像。打开并新建一个文件,取名url_to_image.py,我们开始吧:
# import the necessary packages
import numpy as np
import urllib
import cv2
# METHOD #1: OpenCV, NumPy, and urllib
def url_to_image(url):
# download the image, convert it to a NumPy array, and then read
# it into OpenCV format
resp = urllib.urlopen(url)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# return the image
return image
首先要做的就是导入我们必需的包。我们将使用NumPy转换下载的字节序为NumPy数组,使用urllib来执行实际的网络请求,使用cv2来绑定OpenCV接口。
在第7行,我们定义了我们的url_to_image函数。这个函数带一个url参数,也就是我们想要下载的图像地址。
接下来,在第10行,我们使用urllib库来打开这个图像链接。11行则将这个下载下来的字节序转换为NumPy数组。
至此,NumPy数组还是一个1维数组(也就是一个长长的像素链表)。为了将其转换为2维格式,假设每个像素3个通道(意即分别为红,绿,蓝通道),在12行我们使用cv.imdecode函数。最后,在15行我们返回解码出来的图像给调用函数。
一切就绪,该到让它工作的时候了:
# initialize the list of image URLs to download
"/wp-content/uploads/2015/01/opencv_logo.png",
"/wp-content/uploads/2015/01/google_logo.png",
"/wp-content/uploads/2014/12/adrian_face_detection_sidebar.png",
# loop over the image URLs
for url in urls:
# download the image URL and display it
print "downloading %s" % (url)
image = url_to_image(url)
cv2.imshow("Image", image)
cv2.waitKey(0)
3-5行定义了我们将要下载和转换为OpenCV格式的图像地址列表。
第9行我们遍历这个列表,13行则调用url_to_image函数,然后在14行和15行将获取的图像显示到屏幕上。到此呢,我们就可以像正常情况下一样,使用OpenCV来操作和处理这些图像了。
眼见为实,打开终端,执行如下指令:
代码如下: $ python url_to_image.py&
如果一切顺利的话,你会看到OpenCV的logo:
图1:从URL下载OpenCV logo并转换为OpenCV格式
接下来是Google的logo:
图2:从URL下载Gooogle并转换为OpenCV格式
这里也有在我书中验证人脸检测的例子,《Practical Python and OpenCV》:
图3:转换一个URL图像为OpenCV格式
现在,我们来看另一种获取图像并转换为OpenCV格式的方法。
方法2:使用scikit-image
第二种方法假定你已经在你计算机上安装好了scikit-image库。让我们看看怎样采用scikit-image从URL获取图像并将其转换为OpenCV格式:
# METHOD #2: scikit-image
from skimage import io
# loop over the image URLs
for url in urls:
# download the image using scikit-image
print "downloading %s" % (url)
image = io.imread(url)
cv2.imshow("Incorrect", image)
cv2.imshow("Correct", cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
cv2.waitKey(0)
scikit-image库中做得很漂亮的一点是:io子库中的imread函数能够区分图像路径到底在磁盘上还是一个URL(第9行)。
尽管这样,这里有一个很严重的错误可能让你跌一个跟头!
OpenCV以BGR顺序表达一幅图像,然而scikit-image则是RGB顺序。如果你使用scikit-iamge的imread函数,而且还想在下载完成后使用OpenCV的函数,那么你要小心了。如41行所述,你需要将图像从RBG转换为BGR。
如果你没有这一步,那么你可能得到错误的结果:
图4:在用scikit-image时,需要特别注意将RGB转换为BGR。左边的图像就是不正确的RGB顺序,右边的则是将RGB转换为BGR,所以能正常显示。
看看Google的logo就更明显了
图5:顺序很重要。确保将RGB转换为BGR,否则就留下了一个很难发现的bug。
到此为止,你明白了吧!这两种方法分别使用Python、OpenCV、urllib,和scikit-image来将URL指向的图片转换为图像。
本文中,我们学会了如何从URL获取图像,且使用Python和OpenCV将其转换为OpenCV格式。
第一种方法使用urllib包获取图像,使用Numpy转换为数组,最后使用OpenCV重新构建数组产生我们的图像。
第二种方式使用scikit-image中的io.imread函数。
所以,哪种更好呢?
这完全取决于你的安装。
如果你已经安装scikit-image,那么我可能就用io.imread(只是不要忘记如果要用OpenCV函数的话,要将RGB转换为BGR)。
如果你没有安装scikit-image,那么url_to_image就是手边现成的工具。具体细节参考本文开始处。
我很快会在Github上将这个函数添加到imutils库中。
顶一下(0) 踩一下(0)
热门标签:本模块为跨平台的gui/IO组件,支持平台包括windows,linux,mac,IOS,android,可支持图像/视频/摄像头的读取显示以及转码。
本模块为跨平台的gui/IO组件,包括如下图所示文件:
------------------------------------------------------------------------------------------------------------------
ios.h,cap_ios.h ,& IOS平台相关事件,跳过分析;
highgui_c.h , C/C++兼容头文件,定义了窗口控件相关的flag、实现函数;图像输入输出显示的相关函数;视频摄像头输入输出显示的相关函数;
highgui.hpp , C++ only头文件,定义了创建窗口的flag,窗口事件的flag,Qt窗口的flag,事件回调函数原型,以及窗口/控件操作相关的系列函数,openGL的包装函数;图像输入输出显示的相关函数;视频摄像头输入输出显示的相关函数,VideoCapture,VideoWriter;
------------------------------------------------------------------------------------------------------------------
实现文件:
grfmts/*.* , 内含多种格式图像的支持,grfmt_xxx.hpp/grfmt_xxx.cpp,可在此目录中添加自定义/其他格式的图像读取保存支持;
cap.cpp , CvCapture操作相关的实现函数,可创建基于File或者camera的CvCapture;VideoCapture,CvVideoWriter操作相关的实现函数,可创建基于vfw,dshow,msMF,ffmpeg,gstreamer,quicktime,avfoundation等框架的视频流文件,或者图像文件;
cap_cmu.cpp , 基于cmu1394接口的camera于opencv的抽象实现,实现了一个基于cmu1394的CvCaptureCAM_CMU;
cap_dshow.cpp , 基于dshow框架的camera于opencv的抽象实现,定义了camera的枚举,视频帧的获取等操作,实现了一个基于dshow的CvCaptureCAM_DShow;
cap_ffmpeg.cpp , 基于ffmpeg框架的camera于opencv的抽象实现,这个文件是ffmpeg与CvCapture,CvVideoWriter接口之间的一个代理,实际的实现在cap_ffmpeg_impl.cpp中,代理为CvCapture_FFMPEG_proxy和CvVideoWiriter_FFMPEG_proxy;
cap_ffmpeg_api.hpp,cap_ffmpeg_impl.cpp , 定义实现了CvCapture_FFMPEG,CvVideoWriter_FFMPEG,InputMediaStream_FFMPEG/OutputMediaStream_FFMPEG;
cap_images.cpp , 定义实现了基于图像集的CvCapture_Images和CvVideoWriter_Images实现;
cap_vfw.cpp , 定义实现了基于vfw框架的camera于opencv的抽象实现CvCaptureAVI_VFW(仅用于AVI),CvCaptureCAM_VFW,CvVideoWriter_VFW;
loadsave.cpp , 定义了图像codec集合;imread,imwrite,imencode,imdecode的实现;cvLoadImage,cvSaveImage,cvEncodeImage,cvDecodeImage的实现,此4个函数基于imread函数族;
precomp.cpp,precomp.hpp , 定义CvCapture,CvVideoWriter,以及一系列的create API;这个头文件同时是类似于stdafx的预编译头文件;
utils.hpp/utils.cpp , 定义了BGR2Gray,Gray2BGR,BGRA2RGBA,CMYK2Gray等类型的函数(注:此处与imgproc中的颜色空间转换不同,这里仅是RGB颜色空间中的相关调整操作),以及FillColorRow8等填充函数;
window.cpp& ,实现了窗口/控件/事件/回调的操作函数,包括win32(Windows),QT(跨平台),gtk(Linux),carbon(Mac)窗口系统的实现;
window_w32 ,windows平台的窗口/控件/事件/回调的实现;
window_QT.cpp,window_gtk.cpp,window_carbon.cpp,window_cocoa.mm 相应平台的窗口/控件/事件/回调的实现;
------------------------------------------------------------------------------------------------------------------
OpenCV的gui/io组件可扩展性很好,支持平台多,结构清晰,实现简单;缺点是这个模块的名字highgui有点莫名其妙且包括io,C/C++代码杂揉混乱。
此仅为一己之见,如有疑问/意见,欢迎在评论区留言。
阅读(...) 评论()opencv(1)
OpenCV中最基本的操作:读取、显示、保存图片。
OpenCV2.0版本引入与Matlab命令相同的函数,imread、imshow、imwrite,获取图片更将方便。
读取文件 imread
Mat imread(const string& filename, int flags=1 )其中flags表示载入后图片的颜色模式。
CV_LOAD_IMAGE_UNCHANGED (0) 以RGB模式载入图片
显示图片需要一个窗口。
创建窗口 namedWindow
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )CV_WINDOW_AUTOSIZE 窗口大小自动调整到显示图片的大小
CV_WINDOW_NORMAL 只在Qt中使用,可以改变窗口大小
显示图片 imshow
void imshow(const string& winname, InputArray mat)在窗口中显示图片,对于NORMAL的窗口,把图片缩放到窗口固定大小,再显示。根据图像数据的深度,对图像进行下面的处理:
8-bit unsigned 直接显示
16-bit unsigned or 32-bit integer 像素点值除以256,即把[0,255*256] 映射到 [0,255]
32-bit floating-point 像素点值乘以255,即把[0,1] 映射到 [0,255]
所以,imshow可以正常显示取值范围[0,255]的uchar型图像、取值范围[0,1]的float或double类型图像,中间一种数据格式没用过。
显示图像后,为了避免程序向下运行以致窗口一闪而过,需要等待一旦时间,waitKey正是这个功能。
等待键盘按键 waitKey
int waitKey(int delay=0)delay小于等于0时,一直等待,只到用户按键,再继续执行。
delay大于0时,在delay微秒内等待用户按键。
处理过的图像需要保存到文件中。
保存图像 imwrite
bool imwrite(const string& filename, InputArray img, const vector& params=vector() )params中的每个参数成对出现,即paramId_1, paramValue_1, paramId_2, paramValue_2, … ,当前支持如下参数:
JPEG:压缩质量 ( CV_IMWRITE_JPEG_QUALITY ),从0到100(数值越高质量越好),默认值为95。
PNG:compression level ( CV_IMWRITE_PNG_COMPRESSION ) 从0到9。 数值越高,文件大小越小,压缩时间越长。默认值为3。
PPM, PGM, or PBM:二进制标志 ( CV_IMWRITE_PXM_BINARY ),0 或 1。默认值为1。
还有一组函数,用于从内存读取数据和向内存写入数据。
从内存读图片 imdecode
Mat imdecode(InputArray buf, int flags)写图片到内存 imencode
bool imencode(const string& ext, InputArray img, vector& buf, const vector& params=vector())
ext – 图片的扩展名
img – 要保存的图片
buf – 输出缓存,改变大小以适应数据
params – 格式相关的参数,参见imwrite。
上面两个函数的示例代码如下所示,来自 。
#include &iostream&
#include &fstream&
#include &opencv/cv.h&
#include &opencv/highgui.h&
double getPSNR(Mat& src1, Mat& src2, int bb=0);
int main(int argc, char** argv)
Mat src = imread(&lenna.png&);
//(1) jpeg compression
vector&uchar&//buffer for coding
vector&int& param = vector&int&(2);
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=95;//default(95) 0-100
imencode(&.jpg&,src,buff,param);
cout&&&coded file size(jpg)&&&buff.size()&&//fit buff size automatically.
Mat jpegimage = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
//(2) png compression
param[0]=CV_IMWRITE_PNG_COMPRESSION;
param[1]=3;//default(3)
imencode(&.png&,src,buff,param);
cout&&&coded file size(png)&&&buff.size()&&
Mat pngimage = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
//(3) intaractive jpeg compression
char name[64];
namedWindow(&jpg&);
createTrackbar(&quality&,&jpg&,&q,100);
int key = 0;
while(key!='q')
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=q;
imencode(&.jpg&,src,buff,param);
Mat show = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
double psnr = getPSNR(src,show);//get PSNR
double bpp = 8.0*buff.size()/(show.size().area());//bit/
sprintf(name,&quality:%03d, %.1fdB, %.2fbpp&,q,psnr,bpp);
putText(show,name,Point(15,50), FONT_HERSHEY_SIMPLEX,1,CV_RGB(255,255,255),2);
imshow(&jpg&,show);
key = waitKey(33);
if(key =='s')
//(4) data writing
sprintf(name,&q%03d_%.2fbpp.png&,q,bpp);
imwrite(name,show);
sprintf(name,&q%03d_%.2fbpp.jpg&,q,bpp);
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=q;
imwrite(name,src,param);;
double getPSNR(Mat& src1, Mat& src2, int bb)
double sse,mse,
sse = 0.0;
Mat s1,s2;
cvtColor(src1,s1,CV_BGR2GRAY);
cvtColor(src2,s2,CV_BGR2GRAY);
int count=0;
for(j=j&s1.rows-j++)
uchar* d=s1.ptr(j);
uchar* s=s2.ptr(j);
for(i=i&s1.cols-i++)
sse += ((d[i] - s[i])*(d[i] - s[i]));
if(sse == 0.0 || count==0)
mse =sse /(double)(count);
psnr = 10.0*log10((255*255)/mse);
最后,应该释放窗口。窗口可以自动释放,也可以手动关闭。
释放窗口 destroyWindow destroyAllWindow
void destroyWindow(const string& winname)
void destroyAllWindows()第一个释放单个窗口,第二个释放所有窗口。
转自: /?p=465
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:57226次
排名:千里之外
原创:21篇
转载:29篇
评论:23条
(1)(1)(1)(1)(1)(3)(3)(2)(1)(1)(5)(5)(1)(2)(1)(8)(1)(1)(5)(7)}

我要回帖

更多关于 win7的库在哪个盘 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信