OpenCV是Intel®开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
1. OpenCV与数字图像
在使用OpenCV做视觉或数字图像预处理时,需要读入相机采集来的图像或视频信息。图像数据的获取主要有以下几个步骤:
- 光学相机(CCD/CMOS)采集图像信号;
- 图像采集卡将连续的图像信号转换成计算机能够识别和处理的数字信号,即采样、量化操作;
- 经处理的数字信号通过源编码、压缩、信道编码、调制、解调、解码、复原等操作传输并存储在计算机中;
- 计算机软件再读取存储在硬盘上的图像信息,进行下一步处理。
因此,利用OpenCV对视频和图像信息进行读取和显示操作尤为重要。
2. C语言版本
/***********************************************************************
* OpenCV C - example
***********************************************************************/
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
IplImage* pImg; //声明IplImage指针
//载入图像
if( argc == 2 &&
(pImg = cvLoadImage( argv[1], 1)) != 0 )//[[此处的argc==2是否需要改成argc==1?我改了之后才能运行成功。求大牛解惑]] // wmzzzz : 在"属性"|"debug"|里的command arguments 里加入参数(一个路径:要打开的文件路径) 这时 argc==2 就合理了...可以试试多加几个
{
cvNamedWindow( "Image", 1 );//创建窗口
cvShowImage( "Image", pImg );//显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &pImg ); //释放图像
return 0;
}
return -1;
}
函数说明:
cvLoadImage( filename, -1 ); 默认读取图像的原通道数
cvLoadImage( filename, 0 );强制转化读取图像为灰度图
cvLoadImage( filename, 1 );读取彩色图
3. C++版本
#include "stdafx.h"
#include <string>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
string imagename = "lena.jpg"; //此处需要填写绝对地址,测试时使用相对地址会出错。
//读入图像
Mat img_r = imread(imagename);
//如果读入图像失败
if(img.empty())
{
return -1;
}
//创建窗口
namedWindow("image",1);
//显示图像
imshow("image", img_r);
//等待按键,按键盘任意键返回
waitKey();
return 0;
//string imagename = "lena.jpg"; 处是可以使用相对地址,使用环境为OpenCV 2.4.3
//图片为meinv.jpg置于代码文件所在文件夹的上一级文件夹中,string imagename = "..\\meinv.jpg" 图片可正常显示。
//需提醒注意的是 双引号“” 中出现的第一个 斜杠 \ 被视作转义字符
}
C++版本的好处
- 在于可以尽量避免使用指针这种危险的东西了。
- 另一个好处便在于,不用费心去release资源了,因为在其destructor里面,系统会自动帮你搞定。
4. Python版本
import cv2 as cv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
img = cv.imread("c:\course\ch1\lena.jpg")
#创建窗口并显示图像
cv.namedWindow("Image")
cv.imshow("Image",img)
cv.waitKey(0)
#释放窗口
cv.destroyAllWindows()