您的位置:首页 > 运维架构

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;
}


【未完待续】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: