學(xué)習(xí)計(jì)算機(jī)視覺最重要的能力應(yīng)該就是編程了,為了幫助小伙伴盡快入門計(jì)算機(jī)視覺,小白準(zhǔn)備了【走進(jìn)OpenCV】系列,主要幫助小伙伴了解如何調(diào)用OpenCV庫,涉及到的知識點(diǎn)會做簡單講解。
圖像初始化操作
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; int main(int argc, char** argv) { //這些方式都是自己擁有獨(dú)立的內(nèi)存空間 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; //下面都是淺拷貝,指針指向同一個實(shí)例 Mat img9 = img8; Mat img10(img8); waitKey(0); return 0; }
圖像二值化操作
兩種方法,全局固定閾值二值化和局部自適應(yīng)閾值二值化全局固定閾值很容易理解,就是對整幅圖像都是用一個統(tǒng)一的閾值來進(jìn)行二值化;局部自適應(yīng)閾值則是根據(jù)像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; int main(int argc, char** argv) { Mat image = imread(“l(fā)ol1.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(“l(fā)ena.jpg”); imshow(“Src Pic”, SrcPic); Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函數(shù)返回的是指定形狀和尺寸的結(jié)構(gòu)元素 Mat DstPic; erode(SrcPic, DstPic, element); //腐蝕操作 imshow(“腐蝕效果圖”, DstPic); waitKey(); return 0; }
運(yùn)行效果
均值濾波實(shí)現(xiàn)圖像模糊
#include 《iostream》 #include 《opencv2opencv.hpp》 using namespace cv; using namespace std; int main() { Mat SrcPic = imread(“l(fā)ena.jpg”); imshow(“Src Pic”, SrcPic); Mat DstPic; blur(SrcPic, DstPic, Size(7, 7)); imshow(“均值模糊效果圖”, DstPic); waitKey(); return 0; }
思路:將原始圖像轉(zhuǎn)化為灰度圖,用blur函數(shù)進(jìn)行圖像模糊以降噪,然后用canny函數(shù)進(jìn)行邊緣檢測。
#include 《iostream》 #include 《opencv2opencv.hpp》 using namespace cv; using namespace std; int main() { Mat SrcPic = imread(“l(fā)ena.jpg”); imshow(“Src Pic”, SrcPic); Mat DstPic, edge, grayImage; //創(chuàng)建與src同類型和同大小的矩陣 DstPic.create(SrcPic.size(), SrcPic.type()); //將原始圖轉(zhuǎn)化為灰度圖 cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY); //先使用3*3內(nèi)核來降噪 blur(grayImage, edge, Size(3, 3)); //運(yùn)行canny算子 Canny(edge, edge, 3, 9, 3); imshow(“邊緣提取效果”, edge); waitKey(); return 0; }
轉(zhuǎn)為灰度圖
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; int main() { Mat img = imread(“l(fā)ol1.jpg”); Mat dstImg; cvtColor(img, dstImg,COLOR_BGR2GRAY);//從宏名字就可以知道,是彩色圖轉(zhuǎn)換到灰度圖 imshow(“灰度圖”, dstImg); waitKey(0); }
灰度圖
訪問圖片中像素
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; //訪問每個像素,我喜歡使用指針的方式 int main() { Mat img = imread(“l(fā)ol1.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(“l(fā)ol3.jpg”); imshow(“原始圖”, img); Mat dst; cvtColor(img, img, CV_RGB2GRAY); imshow(“灰度圖”, img); equalizeHist(img, dst); imshow(“直方圖均衡化”, dst); waitKey(0); }
顯然均衡化后的圖片對比度變高了,變得更加明亮!
常用的數(shù)據(jù)結(jié)構(gòu)
#include《opencv2opencv.hpp》 #include《opencv2highguihighgui.hpp》 using namespace std; using namespace cv; //常見數(shù)據(jù)結(jié)構(gòu)使用方法總結(jié) int main() { //Mat的用法 Mat m1(2, 2, CV_8UC3, Scalar(0, 0, 255)); //其中的宏的解釋:CV_[位數(shù)][帶符號與否][類型前綴]C[通道數(shù)] cout 《《 m1 《《 endl; //或者,利用IplImage指針來初始化,將IplImage*轉(zhuǎn)化為Mat IplImage* image = cvLoadImage(“l(fā)ena.jpg”); Mat mat = cvarrToMat(image);
//Mat轉(zhuǎn)IplImage: IplImage img = IplImage(mat); //或者 Mat m2; m2.create(4, 5, CV_8UC(2)); //點(diǎn)的表示:Point Point p; p.x = 1; //x坐標(biāo) p.y = 1; //y坐標(biāo) //或者 Point p2(1, 1);
//顏色的表示:Scalar(b,g,r);注意不是rgb,注意對應(yīng)關(guān)系 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); }
結(jié)束語
由于時(shí)間和文章篇幅有限,本次總結(jié)先到這里,下次小白會為小伙伴們帶來OpenCV的濾波操作,各位小伙伴敬請期待。
責(zé)任編輯:haq
-
機(jī)器視覺
+關(guān)注
關(guān)注
162文章
4375瀏覽量
120366 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41368
原文標(biāo)題:學(xué)習(xí)Opencv不得不掌握的操作
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論