图像的输入输出
C风格的操作:
const char *pstrImageName = "秽土转生第七版.jpg";
const char *pstrWindowsTitle = "窗口标题";
//从文件中读取图像
IplImage *pImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
//创建窗口
cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
//在指定窗口中显示图像
cvShowImage(pstrWindowsTitle, pImage);
//等待按键事件
cvWaitKey();
cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&pImage);
C++风格的操作:
Mat img = imread(pstrImageName);
imshow(pstrWindowsTitle, img);
//等待按键事件
cvWaitKey();
显示图像为:
可以看出使用C++风格的操作优势明显,只需要两步操作即可显示图像,并且不用手动释放资源,开发过程中再也不用担心资源泄漏了。
注意:imread()函数原型为CV_EXPORTS_W Mat imread( const string& filename, int flags=1 );flags默认值为1,如果为0就表示读取的是灰度图像。文件的格式是由读取的内容来决定的,一般是前面几个字节。
将图像以文件的形式保存到磁盘中:
imwrite(filename, img);
文件的格式是由扩展名来决定的。
彩色图像转换为灰度图像
Mat src_mat = imread(pstrImageName);
Mat gray_mat;
cvtColor(src_mat, gray_mat, CV_BGR2GRAY);
imshow("原始图", src_mat);
imshow("灰度图", gray_mat);
waitKey(0);
以上代码也是采用C++风格操作的,C风格的图像转换函数为void cvCvtColor(const CvArr* src, CvArr*dst, intcode)
注意:在OpenCV中,函数名与结构体名的前面以cv和Cv为前缀的都是C风格代码。
源彩色图像与灰度图像分别为:
图像复制
有两种复制方式,分别为clone(), copyTo();代码如下:
Mat cpy_gray = gray_mat.clone();
Mat cpy_gray2;
gray_mat.copyTo(cpy_gray2);
imshow("clone()复制图像", cpy_gray);
imshow("copyTo()复制图像", cpy_gray2);
访问像素的强度值
为了获得像素强度值,就必须知道图像的类型以及通道数。这里举例说明,单通道灰度图像(类型为8UC1)以及像素坐标x、y:
Scalar intensity = img.at<uchar>(y, x);
intensity.val[0]包含一个范围为[0, 255]的值。这里要注意x和y的顺序。x表示列,y表示行,也可以采用另一种方法:
Scalar intensity = img.at<uchar>(Point(x, y));
注意这里的Scalar其实是一个Vec<double, 4>类型的重定义。
下面一个例子中,将图像中每个像素的强度值都加10,重新显示改变后的图像:
Mat chg_src = src_mat.clone();
for (size_t y = 0; y < chg_src.rows; ++y)
{
for (size_t x = 0; x < chg_src.cols; ++x)
{
Vec3b &intensity = chg_src.at<Vec3b>(y, x);
intensity.val[0] += 10;
intensity.val[1] += 10;
intensity.val[2] += 10;
}
}
imshow("彩图像素强度+10", chg_src);
waitKey(0);
显示改变后的图像为:
从摄像头获取图像
从摄像头获取一帧一帧的图像:
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
Mat frame;
for(;;)
{
cap >> frame;
imshow("frame", frame);
if(waitKey(30) >= 0) break;
}
错误处理
错误处理的基本代码为:
try
{
... // call OpenCV
}
catch( cv::Exception& e )
{
const char* err_msg = e.what();
std::cout << "exception caught: " << err_msg << std::endl;
}
【未完待续】