学习计算机视觉最重要的能力应该就是编程了。
图像初始化操作
#include#include usingnamespacestd; usingnamespacecv; intmain(intargc,char** argv) { //这些方式都是自己拥有独立的内存空间 Matimg1(2,2, CV_8UC3, Scalar(0,0,255)); cout<< img1 << endl; int sz[3] = { 2,2,2 }; Mat img2(3, sz, CV_8UC1, Scalar(0, 0, 0)); //cout << img2 << endl; Mat img5; img5.create(4, 4, CV_8UC3); cout << img5 << endl; Mat img6 = Mat::zeros(4, 4, CV_8UC3); cout << img6 << endl; Mat img7 = img6.clone(); cout << img7 << endl; Mat img8; img6.copyTo(img8); cout << img8 << endl; //下面都是浅拷贝,指针指向同一个实例 Mat img9 = img8; Mat img10(img8); waitKey(0); return 0; }
图像二值化操作
两种方法,全局固定阈值二值化和局部自适应阈值二值化全局固定阈值很容易理解,就是对整幅图像都是用一个统一的阈值来进行二值化;局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。
#include#include usingnamespacestd; usingnamespacecv; intmain(intargc,char** argv) { Mat image = imread("lol1.jpg", CV_LOAD_IMAGE_GRAYSCALE);//注意了,必须是载入灰度图 if(image.empty()) { cout<< "read image failure" << endl; return -1; } // 全局二值化 int th = 100; Mat global; threshold(image, global, th, 255, CV_THRESH_BINARY_INV); // 局部二值化 int blockSize = 25; int constValue = 10; Mat local; adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue); imshow("全局二值化", global); imshow("局部二值化", local); waitKey(0); return 0; }
腐蚀操作
#include#include usingnamespacecv; usingnamespacestd; intmain() { Mat SrcPic = imread("lena.jpg"); imshow("Src Pic", SrcPic); Mat element = getStructuringElement(MORPH_RECT, Size(15,15));//getStructuringElement函数返回的是指定形状和尺寸的结构元素 Mat DstPic; erode(SrcPic, DstPic, element);//腐蚀操作 imshow("腐蚀效果图", DstPic); waitKey(); return0; }
均值滤波实现图像模糊
#include#include usingnamespacecv; usingnamespacestd; intmain() { Mat SrcPic = imread("lena.jpg"); imshow("Src Pic", SrcPic); Mat DstPic; blur(SrcPic, DstPic, Size(7,7)); imshow("均值模糊效果图", DstPic); waitKey(); return0; }
思路:将原始图像转化为灰度图,用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测。
#include#include usingnamespacecv; usingnamespacestd; intmain() { Mat SrcPic = imread("lena.jpg"); imshow("Src Pic", SrcPic); Mat DstPic, edge, grayImage; //创建与src同类型和同大小的矩阵 DstPic.create(SrcPic.size(), SrcPic.type()); //将原始图转化为灰度图 cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY); //先使用3*3内核来降噪 blur(grayImage, edge, Size(3,3)); //运行canny算子 Canny(edge, edge,3,9,3); imshow("边缘提取效果", edge); waitKey(); return0; }
转为灰度图
#include#include usingnamespacestd; usingnamespacecv; intmain() { Mat img = imread("lol1.jpg"); Mat dstImg; cvtColor(img, dstImg,COLOR_BGR2GRAY);//从宏名字就可以知道,是彩色图转换到灰度图 imshow("灰度图", dstImg); waitKey(0); }
访问图片中像素
#include#include usingnamespacestd; usingnamespacecv; //访问每个像素,我喜欢使用指针的方式 intmain() { Mat img = imread("lol1.jpg"); for(inti =0; i < img.rows; i++) { uchar* data = img.ptr (i); //获取第i行地址 for(intj =0; j < img.cols; j++) { printf("%d ",data[j]); } } waitKey(0); }
直方图均衡化
#include#include usingnamespacestd; usingnamespacecv; //直方图均衡化 intmain() { Mat img = imread("lol3.jpg"); imshow("原始图", img); Mat dst; cvtColor(img, img, CV_RGB2GRAY); imshow("灰度图", img); equalizeHist(img, dst); imshow("直方图均衡化", dst); waitKey(0); }
显然均衡化后的图片对比度变高了,变得更加明亮!
常用的数据结构
#include#include usingnamespacestd; usingnamespacecv; //常见数据结构使用方法总结 intmain() { //Mat的用法 Matm1(2,2, CV_8UC3, Scalar(0,0,255));//其中的宏的解释:CV_[位数][带符号与否][类型前缀]C[通道数] cout << m1 << endl; //或者,利用IplImage指针来初始化,将IplImage*转化为Mat IplImage* image = cvLoadImage("lena.jpg"); Mat mat = cvarrToMat(image); //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坐标 //或者 Point 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); Rect r2(10, 10, 100, 60); Rect r3 = r1 | r2; //两个矩形求交集 Rect r4 = r1 & r2; //两个矩形求并集 waitKey(0); }
结束语
审核编辑:黄飞
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
边缘检测
+关注
关注
0文章
92浏览量
18202 -
数据结构
+关注
关注
3文章
573浏览量
40092 -
OpenCV
+关注
关注
30文章
628浏览量
41259
原文标题:学习Opencv不得不掌握的操作
文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Vitis HLS工具在Standalone模式下调用Xilinx Vision Library L1 API例程
在论坛上遇到在高层次综合工具中调用视觉库遇到的大多数问题都和 opencv 库以及Xilinx Vision 库的安装路径有关,如今 Vit
发表于 07-25 04:14
•1823次阅读
Qt使用openCV库
使用Qt加OpenCV进行数字图像处理了还是很不错的,参考网上一个帖子分享一下经验:环境:Windows下的Qt4.7.0安装qt-sdk-win-opensource-4.7下载OpenCV库
发表于 11-22 16:12
labview无法调用opencv的dll库怎么回事?
labview201332位的,opencv dll也配制成了32位的,电脑是64位的,然后生成了dll文件里导出了两个函数,一个是普通的相加函数,labview可以正常调用运行;另一个读取了一张
发表于 06-20 10:56
人脸识别历程中的opencv库是1.0还是emcv版本?
Q1.这个历程中的opencv库是否是1.0还是emcv版本啊?Q2.看到里面好多opencv库中有的函数并没有调用,而是重写了一个(比如转
发表于 10-28 14:31
LabVIEW+Python+openCV
现在网上一般关于LabVIEW做视觉常规会用到NI Vision工具包,以及openCV的动态链接库,实现LabVIEW调用openCV的功能,但是NI Vision工具包除非破解,正
发表于 12-07 20:59
怎样去生成能在Qt中应用的opencv库呢
请问如何生成适用于arm版的opencv,能在Qt中应用。(想在Qt中开发opencv相关的功能,需要调用opencv库,我用别的交叉工具链
发表于 12-30 06:58
ok5718怎么调用arm环境下的opencv2来进行交叉编译cpp呢?
现成的交叉编译后的opencv2库以及依赖库吗,在哪里?或者说该怎么调用arm环境下的opencv2来进行交叉编译cpp呢?[/td]
发表于 11-21 13:41
Android系统下OpenCV的人脸检测模块的设计
针对解决OpenCV人脸检测模块在Android平台编译和移植的问题,提出一种利用JNI技术(Java Native Interface)调用OpenCV以及采用Android NDK(Native Development Ki
发表于 11-07 17:40
•118次下载
如何使用Python来调用OpenCV库
果您的电脑是win10的系统,那么请您按下win键,再按下空格键,输入Python,进入Python的IDEA shell界面。这个时候您也可以直接进入CMD进行民命令行模式的编辑,因为第一次可我们并不会很多的代码需要您去编辑。在后期您可以使用轻量级的IDEA,比如sublime test3 或者重量级的Pycharm IDEA进行编辑,它们都是现在世界上十分常用的Python编译器,用它们进行编辑,会给你们一种视觉上的清新之感以及灵魂上的愉悦之感呢。
发表于 05-15 18:10
•3次下载
计算机视觉中如何调用OpenCV库
学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【走进OpenCV】系列,主要帮助小伙伴了解如何调用OpenCV库,涉及到的知识点会做简单讲解。
在LabVIEW中调用OpenVINO™ 模型
自带机器视觉函数库,并提供OpenCV接口库,开发机器视觉与自动化应用程序速度快使用LabVIEW调用OpenVINO IR模型,可以快速完成深度学习项目开发与交付。
opencv-python和opencv一样吗
-Python是OpenCV的一个Python语言接口,它允许开发者使用Python语言来调用OpenCV库的功能。 虽然OpenCV和
评论