学习计算机视觉最重要的能力应该是编程。为了帮助朋友们尽快入门计算机视觉,小白准备了【走进OpenCV】系列,主要帮助朋友们了解如何调用OpenCV库。涉及到的知识点会进行简化。解释。
图像初始化操作
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 使用命名空间std;使用命名空间cv; int main (int argc, char** argv) { //这些方法都有自己独立的内存空间Mat img1 (2 , 2, CV_8UC3, Scalar (0, 0, 255)); cout "
cout "" img5 "" endl; Mat img6=Mat:zeros(4, 4, CV_8UC3); cout "" img6 "" endl; Mat img7=img6.clone(); cout "" img7 "" endl;垫img8; img6.copyTo(img8); cout "
图像二值化操作
有两种方法,全局固定阈值二值化和局部自适应阈值二值化。全局固定阈值很容易理解,即使用统一的阈值对整个图像进行二值化;局部自适应阈值是根据像素的邻域块的像素值分布来确定该像素位置处的二值化阈值。
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 使用命名空间std;使用命名空间cv; int main(int argc, char** argv) { Mat image=imread("lol1.jpg", CV_LOAD_IMAGE_GRAYSCALE); //注意,必须加载灰度图if (image.empty()) { cout "<"读取图像失败" "
腐蚀作业
#include "iostream" #include "opencv2opencv.hpp" 使用命名空间cv;使用命名空间std; int main() { Mat SrcPic=imread("lena.jpg"); imshow("源图片", SrcPic); Mat 元素=getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函数返回指定形状和尺寸的结构元素Mat DstPic;侵蚀(SrcPic,DstPic,元素); //腐蚀操作imshow("腐蚀效果图", DstPic);等待键();返回0; }
运行结果
均值滤波实现图像模糊
#include "iostream" #include "opencv2opencv.hpp" 使用命名空间cv;使用命名空间std; int main() { Mat SrcPic=imread("lena.jpg"); imshow("源图片", SrcPic);垫DstPic;模糊(SrcPic, DstPic, Size(7, 7)); imshow("平均模糊效果图", DstPic);等待键();返回0; }
精明的边缘检测
思路:将原始图像转换为灰度图像,使用blur函数对图像进行模糊处理以减少噪声,然后使用canny函数进行边缘检测。
#include "iostream" #include "opencv2opencv.hpp" 使用命名空间cv;使用命名空间std; int main() { Mat SrcPic=imread("lena.jpg"); imshow("源图片", SrcPic); Mat DstPic、边缘、grayImage; //创建与src相同类型和大小的矩阵DstPic.create(SrcPic.size(), SrcPic.type()); //将原始图像转换为灰度图像cvtColor(SrcPic, GrayImage, COLOR_BGR2GRAY ); //首先使用3*3内核来减少噪声模糊(grayImage, edge, Size(3, 3)); //运行canny算子Canny(edge, edge, 3, 9, 3); imshow("边缘提取效果", edge);等待键();返回0; }
转换为灰度
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 使用命名空间std;使用命名空间cv; int main() { Mat img=imread("lol1.jpg"); Mat dstImg; cvtColor(img, dstImg, COLOR_BGR2GRAY) ;//从宏名可以知道彩色图像转换为灰度图像imshow("灰度图像", dstImg);等待键(0); }
灰度图像
访问图像中的像素
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 使用命名空间std;使用命名空间cv; //访问每个像素,我喜欢用指针int main() { Mat img=imread("lol1.jpg" ); for (int i=0; i " img.rows; i++) { uchar* data=img.ptr "uchar" (i); //获取第i行地址for (int j=0; j " img. cols; j++) { printf("%d", 数据[j]); } } 等待键(0); }
直方图均衡化
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 使用命名空间std;使用命名空间cv; //直方图均衡int main() { Mat img=imread("lol3.jpg"); imshow("原始图像", img);垫dst; cvtColor(img,img,CV_RGB2GRAY); imshow(“灰度”,img); equalizeHist(img, dst); imshow("直方图均衡化", dst);等待键(0); }
明显均衡后的画面对比度变高了,也变亮了!
常用数据结构
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 使用命名空间std;使用命名空间cv; //常用数据结构用法总结int main() { //Mat 用法Mat m1(2, 2, CV_8UC3, Scalar (0, 0, 255)); //宏解释:CV_[位数][有符号与否][类型前缀]C[通道数] cout "" m1 "" endl; //或者,使用IplImage指针初始化,将IplImage*转换为Mat IplImage* image=cvLoadImage("lena.jpg"); Mat mat=cvarrToMat(图像);
//Mat 到IplImage: IplImage img=IplImage(mat); //或Mat m2; m2.create(4, 5, CV_8UC(2)); //点的表示:Point Point p; p.x=1; //x 坐标p.y=1; //y坐标//或点p2(1, 1);
//颜色的表示:Scalar(b,g,r);注意不是rgb,注意对应关系Scalar(1,1,1); //大小的表示方法:Size Size(5, 5); //宽度和高度都是5 //矩形的表示: Rect,成员变量有x, y, width, height Rect r1(0, 0, 100, 60);矩形r2 (10, 10, 100, 60);矩形r3=r1 | r2; //求两个矩形的交集Rect r4=r1 r2; //求两个矩形的并集waitKey(0); }
结论
由于时间和文章篇幅有限,先做个总结。下次小白会给小伙伴们带来OpenCV的滤波操作,敬请期待。
责任编辑:haq