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。
上面两个函数的示例代码如下所示,来自http://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63 。
#include
#include
#include
#include
using
namespace
std
;
using
namespace
cv
;
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
>
buff
;
//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
(
)
<<
endl
;
//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) 0-9.
imencode
(
".png"
,
src
,
buff
,
param
)
;
cout
<<
"coded file size(png)"
<<
buff
.
size
(
)
<<
endl
;
Mat
pngimage
=
imdecode
(
Mat
(
buff
)
,
CV_LOAD_IMAGE_COLOR
)
;
//(3) intaractive jpeg compression
char
name
[
64
]
;
namedWindow
(
"jpg"
)
;
int
q
=
95
;
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/pixe;
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
)
{
int
i
,
j
;
double
sse
,
mse
,
psnr
;
sse
=
0.0
;
Mat
s1
,
s2
;
cvtColor
(
src1
,
s1
,
CV_BGR2GRAY
)
;
cvtColor
(
src2
,
s2
,
CV_BGR2GRAY
)
;
int
count
=
0
;
for
(
j
=
bb
;
j
<
s1
.
rows
-
bb
;
j
++
)
{
uchar
*
d
=
s1
.
ptr
(
j
)
;
uchar
*
s
=
s2
.
ptr
(
j
)
;
for
(
i
=
bb
;
i
<
s1
.
cols
-
bb
;
i
++
)
{
sse
+=
(
(
d
[
i
]
-
s
[
i
]
)
*
(
d
[
i
]
-
s
[
i
]
)
)
;
count
++
;
}
}
if
(
sse
==
0.0
||
count
==
0
)
{
return
0
;
}
else
{
mse
=
sse
/
(
double
)
(
count
)
;
psnr
=
10.0
*
log10
(
(
255
*
255
)
/
mse
)
;
return
psnr
;
}
}
释放窗口 destroyWindow destroyAllWindow
|
void
destroyWindow
(
const
string
&
winname
)
void
destroyAllWindows
(
)
|