<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          (附代碼)學(xué)習(xí)Opencv不得不掌握的操作

          共 6998字,需瀏覽 14分鐘

           ·

          2021-09-30 00:20

          點擊左上方藍(lán)字關(guān)注我們



          一個專注于目標(biāo)檢測與深度學(xué)習(xí)知識分享的公眾號

          編者薦語
          學(xué)習(xí)計算機視覺非常容易忽視卻非常重要的能力應(yīng)該就是編程了,為了幫助小伙伴盡快入門計算機視覺,本篇文章系統(tǒng)性的講解了一些基礎(chǔ)的知識,主要幫助小伙伴了解如何調(diào)用OpenCV庫,希望對新入門的同學(xué)有一定的幫助。
          轉(zhuǎn)載自 | 小白學(xué)視覺

          圖像初始化操作


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.hpp>
          using namespace std;
          using namespace cv;
          int main(int argc, char** argv)
          {
                //這些方式都是自己擁有獨立的內(nèi)存空間
             Mat img1(22, CV_8UC3, Scalar(00255));
             cout << img1 << endl;
             int sz[3] = { 2,2,2 };
             Mat img2(3, sz, CV_8UC1, Scalar(000));
             //cout << img2 << endl;
             Mat img5;
             img5.create(44, CV_8UC3);
             cout << img5 << endl;
             Mat img6 = Mat::zeros(44, 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;
          }


          圖像二值化操作


          兩種方法,全局固定閾值二值化和局部自適應(yīng)閾值二值化全局固定閾值很容易理解,就是對整幅圖像都是用一個統(tǒng)一的閾值來進(jìn)行二值化;局部自適應(yīng)閾值則是根據(jù)像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。

          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.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 <opencv2\opencv.hpp>
          using namespace cv;
          using namespace std;
          int main()
          {
             Mat SrcPic = imread("lena.jpg");
             imshow("Src Pic", SrcPic);
             Mat element = getStructuringElement(MORPH_RECT, Size(1515)); //getStructuringElement函數(shù)返回的是指定形狀和尺寸的結(jié)構(gòu)元素
             Mat DstPic;
             erode(SrcPic, DstPic, element); //腐蝕操作
             imshow("腐蝕效果圖", DstPic);
             waitKey();
             return 0;
          }

          運行效果

          均值濾波實現(xiàn)圖像模糊


          #include <iostream>
          #include <opencv2\opencv.hpp>
          using namespace cv;
          using namespace std;
          int main()
          {
             Mat SrcPic = imread("lena.jpg");
             imshow("Src Pic", SrcPic);
             Mat DstPic;
             blur(SrcPic, DstPic, Size(77));
             imshow("均值模糊效果圖", DstPic);
             waitKey();
             return 0;
          }

          運行效果

          canny邊緣檢測


          思路:將原始圖像轉(zhuǎn)化為灰度圖,用blur函數(shù)進(jìn)行圖像模糊以降噪,然后用canny函數(shù)進(jìn)行邊緣檢測。

          #include <iostream>
          #include <opencv2\opencv.hpp>
          using namespace cv;
          using namespace std;
          int main()
          {
             Mat SrcPic = imread("lena.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(33));
             //運行canny算子
             Canny(edge, edge, 393);
             imshow("邊緣提取效果", edge);
             waitKey();
             return 0;
          }

          運行效果

          轉(zhuǎn)為灰度圖


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.hpp>
          using namespace std;
          using namespace cv;
          int main()
          {
             Mat img = imread("lol1.jpg");
             Mat dstImg;
             cvtColor(img, dstImg,COLOR_BGR2GRAY);//從宏名字就可以知道,是彩色圖轉(zhuǎn)換到灰度圖
             imshow("灰度圖", dstImg);
             waitKey(0);
          }

          灰度圖

          訪問圖片中像素


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.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\n",data[j]);
                 }
             }
             waitKey(0);
          }


          直方圖均衡化


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.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);
          }

          顯然均衡化后的圖片對比度變高了,變得更加明亮!

          常用的數(shù)據(jù)結(jié)構(gòu)


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.hpp>

          using namespace std;
          using namespace cv;

          //常見數(shù)據(jù)結(jié)構(gòu)使用方法總結(jié)
          int main()
          {
             //Mat的用法
             Mat m1(22, CV_8UC3, Scalar(00255))//其中的宏的解釋:CV_[位數(shù)][帶符號與否][類型前綴]C[通道數(shù)]
             cout << m1 << endl;

             //或者,利用IplImage指針來初始化,將IplImage*轉(zhuǎn)化為Mat
             IplImage* image = cvLoadImage("lena.jpg");
             Mat mat = cvarrToMat(image);

             //Mat轉(zhuǎn)IplImage:
             IplImage img = IplImage(mat);

             //或者
             Mat m2;
             m2.create(45, CV_8UC(2));


             //點的表示:Point
             Point p;
             p.x = 1//x坐標(biāo)
             p.y = 1//y坐標(biāo)

             //或者
             Point p2(11);

             //顏色的表示:Scalar(b,g,r);注意不是rgb,注意對應(yīng)關(guān)系
             Scalar(111);

             //尺寸的表示:Size
             Size(55);// 寬度和高度都是5

             //矩形的表示:Rect,成員變量有x,y,width,height
             Rect r1(0010060);
             Rect r2(101010060);
             Rect r3 = r1 | r2; //兩個矩形求交集
             Rect r4 = r1 & r2; //兩個矩形求并集

             waitKey(0);

          }


          END



          雙一流大學(xué)研究生團(tuán)隊創(chuàng)建,專注于目標(biāo)檢測與深度學(xué)習(xí),希望可以將分享變成一種習(xí)慣!

          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美在线www | 青青草原视频精品在线免费观看 | 亚洲欧美操逼网 | 国产精品 aa | 亚洲人妻系列 |