<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不得不掌握的操作

          共 7066字,需瀏覽 15分鐘

           ·

          2021-09-07 00:28

          點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺(jué)”公眾號(hào)

          視覺(jué)/圖像重磅干貨,第一時(shí)間送達(dá)

          ?

          ?轉(zhuǎn)自 | 小白學(xué)視覺(jué)?

          ?

          小白導(dǎo)讀

          學(xué)習(xí)計(jì)算機(jī)視覺(jué)最重要的能力應(yīng)該就是編程了,為了幫助小伙伴盡快入門計(jì)算機(jī)視覺(jué),小白準(zhǔn)備了【走進(jìn)OpenCV】系列,主要幫助小伙伴了解如何調(diào)用OpenCV庫(kù),涉及到的知識(shí)點(diǎn)會(huì)做簡(jiǎn)單講解。

          圖像初始化操作


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.hpp>
          using namespace std;
          using namespace cv;
          int main(int argc, char** argv)
          {
                //這些方式都是自己擁有獨(dú)立的內(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;
             //下面都是淺拷貝,指針指向同一個(gè)實(shí)例
             Mat img9 = img8;
             Mat img10(img8);
             waitKey(0);
             return 0;
          }


          圖像二值化操作


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

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


          原始圖

          兩種二值化效果對(duì)比

          腐蝕操作


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

          運(yùn)行效果

          均值濾波實(shí)現(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;
          }

          運(yùn)行效果

          canny邊緣檢測(cè)


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

          #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)核來(lái)降噪
             blur(grayImage, edge, Size(33));
             //運(yùn)行canny算子
             Canny(edge, edge, 393);
             imshow("邊緣提取效果", edge);
             waitKey();
             return 0;
          }

          運(yùn)行效果

          轉(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);
          }

          灰度圖

          訪問(wèn)圖片中像素


          #include<opencv2\opencv.hpp>  
          #include<opencv2\highgui\highgui.hpp>
          using namespace std;
          using namespace cv;
          //訪問(wèn)每個(gè)像素,我喜歡使用指針的方式
          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);
          }

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

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


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

          using namespace std;
          using namespace cv;

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

             //或者,利用IplImage指針來(lái)初始化,將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));


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

             //或者
             Point p2(11);

             //顏色的表示:Scalar(b,g,r);注意不是rgb,注意對(duì)應(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; //兩個(gè)矩形求交集
             Rect r4 = r1 & r2; //兩個(gè)矩形求并集

             waitKey(0);

          }


          結(jié)束語(yǔ)

          由于時(shí)間和文章篇幅有限,本次總結(jié)先到這里,下次小白會(huì)為小伙伴們帶來(lái)OpenCV的濾波操作,各位小伙伴敬請(qǐng)期待。


          —版權(quán)聲明—

          僅用于學(xué)術(shù)分享,版權(quán)屬于原作者。

          若有侵權(quán),請(qǐng)聯(lián)系微信號(hào):yiyang-sy 刪除或修改!


          —THE END—
          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产内射ⅹxⅹx在线 | 久久丁香五月天综合网 | 欧美激情亚洲五码 | 福利逼站| 久久免费无人区 |