OpenCV之图像基本操作
2014-05-22 22:59
211 查看
图像的输入输出
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; }
【未完待续】
相关文章推荐
- opencv2.3图像基本操作
- Opencv2系列学习笔记1(图像的基本操作)
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV GUI基本操作,回调函数,进度条,裁剪图像等
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- Opencv笔记——图像的部分基本操作(待补充)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- Python & OpenCV 图像基本操作
- Qt&OpenCV——Q图像处理基本操作
- opencv基本图像操作
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
- opencv学习笔记1:矩阵和图像基本操作
- OpenCV 编程简介(矩阵/图像/视频的基本读写操作)