OpenCV之图像基本操作

图像的输入输出

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



未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值