计算机视觉中如何调用OpenCV库
未知 | 2021-09-08 14:46

进修计算机视觉最重要的才能应当就是编程了,为了赞助小伙伴尽快入门计算机视觉,小白预备了【走进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 = http://www.elecfans.com/d/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 = http://www.elecfans.com/d/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

精彩推荐