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

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

3天内不再提示

如何调用OpenCV库

新机器视觉 来源:小白学视觉 2023-12-26 10:41 次阅读

学习计算机视觉最重要的能力应该就是编程了。

图像初始化操作

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

canny边缘检测

思路:将原始图像转化为灰度图,用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

    文章

    91

    浏览量

    18105
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39900
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40789

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

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

收藏 人收藏

    评论

    相关推荐

    Vivado设计流程分析 Vivado HLS实现OpenCV的开发流程

    作者:Harvest Guo来源:Xilinx DSP Specilist 本文通过对OpenCV中图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS中调用OpenCV库函数实现图像
    发表于 04-23 11:32 5681次阅读
    Vivado设计流程分析 Vivado HLS实现<b class='flag-5'>OpenCV</b>的开发流程

    Qt使用openCV

    使用Qt加OpenCV进行数字图像处理了还是很不错的,参考网上一个帖子分享一下经验:环境:Windows下的Qt4.7.0安装qt-sdk-win-opensource-4.7下载OpenCV
    发表于 11-22 16:12

    labview调用opencv

    请问谁会labview调用opencv,我想调用opencv里人脸识别的功能,求指点
    发表于 06-21 18:24

    人脸识别历程中的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次下载
    Android系统下<b class='flag-5'>OpenCV</b>的人脸检测模块的设计

    python图像处理opencv步骤是怎么样的

    越来越觉得python是一强大的工具,处理样本确实不错。最近因项目需要涉及到图片处理,所以开始用python调用opencv,再次觉得python真乃神器也!
    发表于 12-04 15:29 4233次阅读

    如何使用Python来调用OpenCV

    果您的电脑是win10的系统,那么请您按下win键,再按下空格键,输入Python,进入Python的IDEA shell界面。这个时候您也可以直接进入CMD进行民命令行模式的编辑,因为第一次可我们并不会很多的代码需要您去编辑。在后期您可以使用轻量级的IDEA,比如sublime test3 或者重量级的Pycharm IDEA进行编辑,它们都是现在世界上十分常用的Python编译器,用它们进行编辑,会给你们一种视觉上的清新之感以及灵魂上的愉悦之感呢。
    发表于 05-15 18:10 3次下载
    如何使用Python来<b class='flag-5'>调用</b><b class='flag-5'>OpenCV</b>库

    OpenCV新版本4.5.1发布

    ,以方便再网页中使用,并提供了相关教程。 图像分类   目标检测   风格迁移   语义分割   姿态估计 2. OpenCV.js WASM SIMD 优化 2.0,网页端调用OpenCV更快了 3.
    的头像 发表于 12-31 09:47 2506次阅读

    计算机视觉中如何调用OpenCV

    学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【走进OpenCV】系列,主要帮助小伙伴了解如何调用OpenCV库,涉及到的知识点会做简单讲解。 图像初始化操作
    的头像 发表于 09-08 10:26 4611次阅读

    汉字取模读取并显示

    获取汉字5.2 利用机内码获取汉字四、在ubuntu中调用OpenCV显示图片并打印汉字1、实验要求2、实验进行前的准备3、代码编写一、概述本文主要介绍了汉字点阵的原理,了解汉字的机内码和区位码的编码
    发表于 12-27 19:27 1次下载
    汉字取模读取并显示

    自动驾驶:自动泊车之AVM环视系统算法2

    在前面的工作中,我们调用opencv函数findChessboardCorners提取图像上位于标定布中间的棋盘格角点,然后计算投影矩阵H。在SLAM 14讲中[1],计算H就是求解Ax=0这样一个问题。
    的头像 发表于 02-03 16:09 2498次阅读

    Python调用OpenCV实现图像腐蚀案例

    图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。
    的头像 发表于 12-20 10:20 291次阅读
    Python<b class='flag-5'>调用</b><b class='flag-5'>OpenCV</b>实现图像腐蚀案例