Opencv 3.3.0 常用函數


如何調圖像的亮度和對比度?

//如何增加圖片的對比度或亮度?
void contrastOrBrightAdjust(InputArray &src,OutputArray &dst,int contrastValue,int brightValue)
{
  cv::Mat _dst = cv::Mat::zeros( src.size(), src.type() );
  for(int y = 0; y < src.rows; y++ )
  {
    for(int x = 0; x < src.cols; x++ )
    {
      for(int c = 0; c < 3; c++ )
      {
        _dst.at<cv::Vec3b>(y,x)[c]= cv::saturate_cast<uchar>( (contrastValue*0.01)*(src.at<cv::Vec3b>(y,x)[c] ) + brightValue);
      }
    }
  }
  dst = _dst;
  return;
}row

如何在 cv::imshow() 函數上創建滑塊 cv::createTrackbar()

//void callBack(int, void*);
//getTrackbarPos()//獲取當前滑塊位置
cv::Mat src = cv::Mat::zeros(cv::Size(888,888),3);
cv::nameWindow("Win7",cv::WINDOW_NORMAL);
CV::createTrackbar("Trackbar","Win7",0,100,NULL);
cv::imshow("Win7",src);

如何讀取圖像和保存圖像?

cv::Mat src = imread("C:/Desktop.jpg");
imWrite("C:/Desktops.jpg",src(Rect(0,0,88,88)));

輪廓檢測 cv::Canny()

cv::Mat src = imread("C:/Desktop.jpg");
cvtColor(src,src,CV_BGR2GRAY);
Canny(src,src,120,180);
threshold(src,src,0,255,CV_THRESH_OTSU);
cv::nameWindow("Win7",cv::WINDOW_NORMAL);
cv::imshow("Win7",src);
//findContours()//獲取輪廓個數
//DrawContours()//畫輪廓
//arcLength()//弧長
//approxPolyDP()//輪廓近似
//minAreaRect()//計算最小面積的外接矩形
//contourArea()//計算輪廓內連通區域的面積
//pointPolygenTest()//判斷一個點是否在一個多邊形內
//mathShapes()//比較兩個形狀的相似性
//dilate()//膨脹
//resize()//圖像的放大和縮小
//GaussianBlur()//高斯濾波
//medianBlur()//中值濾波
//blur()//均值濾波
//bilateralFilter()//雙邊濾波
//boxFilter()//方框濾波
//split()//分離通道

霍夫直線檢測

HoughLins();
HoughLinsP();
//俗話說:好記性不如爛筆頭
//用到opencv 中的函數時往往會一時記不起這個函數的具體參數怎么設置,故在此將常用函數做一匯總;

Mat srcImage = imread("C:/Users/Administrator/Desktop/車牌識別/車牌圖像庫/1.jpg");//讀入圖像函數

imshow("原圖",srcImage);//顯示圖像函數

imwrite("圖3.jpg",imageRIO);//保存圖像函數

Mat imageRIO = srcImage(Rect(50,50,100,000));//感興趣區域函數

cvtColor(srcImage,dstImage,CV_BGR2GRAY);//圖像灰度化


//邊緣檢測 Sobel Laplacian Canny 其中Canny算子只能處理(8位)灰度圖,其余兩種8位32位都可以
Mat grad_x,grad_y;
Sobel(imgGray,grad_x,CV_8U,1,0,3,1,1);//X方向上的Sobel算子檢測,其中3,1,0都是默認值

Sobel(imgGray,grad_y,CV_8U,0,1,3,1,0);//Y方向上的Sobel算子檢測,其中3,1,0都是默認值

addWeighted(grad_x,0.5,grad_y,0.5,0,dstImage);//合並梯度

Laplacian(imgGray,dstImage,CV_8U);

Canny(imgGray,dstImage,50,200,3);//50和200表示第一個滯后性閾值和第二個滯后性閾值,較小者用於邊緣連接,較大者控制強邊緣的初始段,達閾值opnecv推薦為小閾值的3倍;
//3表示應用的Sobel算子的孔徑大小 有默認值為3;

// 尋找輪廓 只處理8位 即灰度圖像
vector<vector<Point>> contours;
findContours(imgGray,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
drawContours(dstImage,contours,-1,Scalar(0),3);
imshow("輪廓圖",dstImage);


//閾值化操作
threshold(srcImage,dstImage,100,255,3);
imshow("固定閾值化圖像",dstImage);
adaptiveThreshold(imgGray,dstImage,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,3,1);
imshow("自適應閾值化圖像",dstImage);


// resize函數實現
resize(srcImage,dstImage,Size(),0.5,0.5);//縮小為一半
resize(srcImage,dstImage,Size(),2,2);//放大2倍
resize(srcImage,dstImage,Size(srcImage.cols*3,srcImage.rows*3));//放大3倍


// 金字塔函數實現
pyrUp(srcImage,dstImage,Size(srcImage.cols*2,srcImage.rows*2));// 放大2倍
pyrDown(srcImage,dstImage,Size(srcImage.cols/2,srcImage.rows/2));// 縮小2倍

//漫水填充算法
Rect ccomp;
floodFill(srcImage,Point(50,300),Scalar(155,255,55),&ccomp,Scalar(20,20,20),Scalar(20,20,20));

//膨脹腐蝕
Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
erode(srcImage,dstImage,element);//腐蝕函數
dilate(srcImage,dstImage,element);//膨脹函數

morphologyEx(g_bgrImage,g_bgrImage, MORPH_CLOSE, element);//閉運算

morphologyEx(g_bgrImage,g_bgrImage, MORPH_OPEN, element);//開運算


//濾波
boxFilter(srcImage,dstImage,-1,Size(3,3));
imshow("方框濾波圖",dstImage);

blur(srcImage,dstImage,Size(3,3));
imshow("均值濾波圖",dstImage);

GaussianBlur(srcImage,dstImage,Size(5,7),1,1);
imshow("高斯濾波圖",dstImage);

medianBlur(image,out,7);//中值濾波,7為孔徑的線性尺寸
bilateralFilter(src,dst,d,sigmaColor,sigmaSpace);//雙邊濾波,d表示過濾過程中每個像素鄰域的直徑,sigmaColor顏色空間濾波器的sigma值,sigmaSpace表示坐標空間中濾波器的sigma值
bilateralFilter(image,out,25,25*2,25/2);

//《未完待續》
關於“輪廓檢測”和“邊緣檢測”這兩個自己也弄的不是特別清楚,可能確實比較相似吧。下面簡單說一下自己的看法。
區別:
邊緣檢測主要是通過一些手段檢測數字圖像中明暗變化劇烈(即梯度變化比較大)像素點,偏向於圖像中像素點的變化。
如canny邊緣檢測,結果通常保存在和源圖片一樣尺寸和類型的邊緣圖中。
輪廓檢測指檢測圖像中的對象邊界,更偏向於關注上層語義對象。
如OpenCV中的findContours()函數, 它會得到每一個輪廓並以點向量方式存儲,除此也得到一個圖像的拓撲信息,即一個輪廓的后一個輪廓、前一個輪廓、父輪廓和內嵌輪廓的索引編號。
聯系:
我們在做圖像的輪廓檢測時通常可以先檢測邊緣,再將檢測到的邊緣進行進一步處理,得到圖像的輪廓。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM