0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

计算机视觉中如何调用OpenCV库

新机器视觉 来源:博客园 作者:谢玉林 2021-09-08 10:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【走进OpenCV】系列,主要帮助小伙伴了解如何调用OpenCV库,涉及到的知识点会做简单讲解。

图像初始化操作

#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; int main(int argc, char** argv) { //这些方式都是自己拥有独立的内存空间 Mat img1(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《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; int main(int argc, 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 《iostream》 #include 《opencv2opencv.hpp》 using namespace cv; using namespace std; int main() { 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(); return 0; }

运行效果

均值滤波实现图像模糊

#include 《iostream》 #include 《opencv2opencv.hpp》 using namespace cv; using namespace std; int main() { Mat SrcPic = imread(“lena.jpg”); imshow(“Src Pic”, SrcPic); Mat DstPic; blur(SrcPic, DstPic, Size(7, 7)); imshow(“均值模糊效果图”, DstPic); waitKey(); return 0; }

canny边缘检测

思路:将原始图像转化为灰度图,用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测。

#include 《iostream》 #include 《opencv2opencv.hpp》 using namespace cv; using namespace std; int main() { 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(); return 0; }

转为灰度图

#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; int main() { Mat img = imread(“lol1.jpg”); Mat dstImg; cvtColor(img, dstImg,COLOR_BGR2GRAY);//从宏名字就可以知道,是彩色图转换到灰度图 imshow(“灰度图”, dstImg); waitKey(0); }

灰度图

访问图片中像素

#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace 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 ”,data[j]); } } waitKey(0); }

直方图均衡化

#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; //直方图均衡化 int main() { Mat img = imread(“lol3.jpg”); imshow(“原始图”, img); Mat dst; cvtColor(img, img, CV_RGB2GRAY); imshow(“灰度图”, img); equalizeHist(img, dst); imshow(“直方图均衡化”, dst); waitKey(0); }

显然均衡化后的图片对比度变高了,变得更加明亮!

常用的数据结构

#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace 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(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); }

结束语

由于时间和文章篇幅有限,本次总结先到这里,下次小白会为小伙伴们带来OpenCV的滤波操作,各位小伙伴敬请期待。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器视觉
    +关注

    关注

    163

    文章

    4728

    浏览量

    124999
  • OpenCV
    +关注

    关注

    33

    文章

    651

    浏览量

    44408

原文标题:学习Opencv不得不掌握的操作

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用代理式AI激活传统计算机视觉系统的三种方法

    当前的计算机视觉系统擅长于识别物理空间与流程的事件,却难以诠释场景细节及其意义,也无法推理后续可能发生的情况。
    的头像 发表于 12-01 09:44 327次阅读

    机器视觉双雄YOLO 和 OpenCV 到底有啥区别?别再傻傻分不清!

    如何在深圳市钡铼技术有限公司的AI边缘计算产品结合,实现真正的“视觉智能”。 一、前言:为什么总有人把YOLO和OpenCV搞混? 在AI视觉
    的头像 发表于 10-14 16:00 535次阅读
    机器<b class='flag-5'>视觉</b>双雄YOLO 和 <b class='flag-5'>OpenCV</b> 到底有啥区别?别再傻傻分不清!

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板安装openCV4以及第三方contrib

    在嵌入式应用开发领域,OpenCV凭借其丰富的功能成为开发者处理计算机视觉任务的首选工具。Buildroot为开发者提供了便捷的嵌入式系统构建环境,其默认集成的OpenCV版本为4.5
    的头像 发表于 08-05 11:03 4306次阅读
    ElfBoard技术贴|如何在【RK3588】ELF 2开发板<b class='flag-5'>中</b>安装<b class='flag-5'>openCV</b>4以及第三方<b class='flag-5'>库</b>contrib

    易控智驾荣获计算机视觉顶会CVPR 2025认可

    近日,2025年国际计算机视觉与模式识别顶级会议(IEEE/CVF Conference on Computer Vision and Pattern Recognition,CVPR 2025)在美国田纳西州纳什维尔召开。
    的头像 发表于 07-29 16:54 976次阅读

    工业计算机的重要性

    工业计算机对某些行业至关重要。我们将在下面详细解释这些行业的工业计算机应用。1.制造与工业自动化工业级计算机非常适合制造工厂,特别是那些想要自动化装配过程的工厂。在这样的环境
    的头像 发表于 07-28 16:07 398次阅读
    工业<b class='flag-5'>计算机</b>的重要性

    自动化计算机经过加固后有什么好处?

    让我们讨论一下部署坚固的自动化计算机的一些好处。1.温度范围宽自动化计算机经过工程设计,配备了支持宽温度范围的组件,使自动化计算解决方案能够在各种不同的极端环境运行。自动化
    的头像 发表于 07-21 16:44 419次阅读
    自动化<b class='flag-5'>计算机</b>经过加固后有什么好处?

    自动化计算机的功能与用途

    工业自动化是指利用自动化计算机来控制工业环境的流程、机器人和机械,以制造产品或其部件。工业自动化的目的是提高生产率、增加灵活性,并提升制造过程的质量。工业自动化在汽车制造中体现得最为明显,其中许多
    的头像 发表于 07-15 16:32 527次阅读
    自动化<b class='flag-5'>计算机</b>的功能与用途

    工业计算机与商用计算机的区别有哪些

    工业计算机是一种专为工厂和工业环境设计的计算系统,具有高可靠性和稳定性,能够应对恶劣环境下的自动化、制造和机器人操作。其特点包括无风扇散热技术、无电缆连接和防尘防水设计,使其在各种工业自动化场景
    的头像 发表于 07-10 16:36 516次阅读
    工业<b class='flag-5'>计算机</b>与商用<b class='flag-5'>计算机</b>的区别有哪些

    部署计算机上运行 LabVIEW 应用程序时出现以下错误: “缺少外部函数 dll...”解决办法

    DLL 生成的VI. 这个办法亲试有效 确保 DLL 路径名称在开发环境和目标环境之间没有变化。 如果是这样,在开发计算机上,转到构建规范 选择附加除项。 禁用不包括非独立共享。 这会将 DLL 包含在“始终包含”文件夹
    发表于 04-01 19:10

    Arm KleidiCV与OpenCV集成助力移动端计算机视觉性能优化

    等多种应用。然而,这些计算机视觉应用可能很难实现最优化的延迟性能和处理速度,特别是在内存大小、电池容量和处理能力有限的移动设备上难度更高。 而 Arm KleidiCV 便能在其中大显身手。该开源
    的头像 发表于 02-24 10:15 875次阅读

    AR和VR计算机视觉

    ):计算机视觉引领混合现实体验增强现实(AR)和虚拟现实(VR)正在彻底改变我们与外部世界的互动方式。即便是在引人入胜的沉浸式
    的头像 发表于 02-08 14:29 2124次阅读
    AR和VR<b class='flag-5'>中</b>的<b class='flag-5'>计算机</b><b class='flag-5'>视觉</b>

    云端超级计算机使用教程

    云端超级计算机是一种基于云计算的高性能计算服务,它将大量计算资源和存储资源集中在一起,通过网络向用户提供按需的计算服务。下面,AI部落小编为
    的头像 发表于 12-17 10:19 941次阅读

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    1 简介 Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉,它实现了图像处理和
    发表于 12-14 09:31

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    1简介Opencv(OpenSourceComputerVisionLibrary)是一个基于开源发行的跨平台计算机视觉,它实现了图像处理和计算机
    的头像 发表于 12-14 09:10 1260次阅读
    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署<b class='flag-5'>OpenCV</b>

    【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

    OpenCV是一个广受欢迎且极为流行的计算机视觉,它因其强大的功能、灵活性和开源特性而在开发者和研究者备受青睐。学习
    的头像 发表于 12-09 16:42 1893次阅读
    【AI实战项目】基于<b class='flag-5'>OpenCV</b>的“颜色识别项目”完整操作过程