CV2 openCV 學習筆記(自己總結的概括,未整理)

CV2

opencv讀取圖片是B G R的方式,PIL讀取圖片是R G B

轉換方式:img2=img[: , : , : : -1]  或者

b,g,r = cv2.split(img)
img_rgb = cv2.merge([r,g,b])

畫出多邊形輪廓 cv2.polylines(圖片,np.int32([點集]), closed, color)

填充多邊形區域 cv2.fillPoly(圖片,np.int32([點集]), color)

腐蝕 cv2.erode(srcImg,Kernel=None,iterations=n)

膨脹 cv2.dilate(mask, None, iterations=8)

mask截取,位運算

cv2.bitwise_and是對二進制數據進行“與”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“與”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是對二進制數據進行“或”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是對二進制數據進行“異或”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“異或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是對二進制數據進行“非”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“非”操作,~1=0,~0=1

img = cv2.bitwise_or(img,img,mask=dilate) //根據mask截圖

# 圖片輪廓 image, contours, hierarchy = cv2.findContours(thresh, 2, 1)

cnt = contours[0]

# 尋找凸包(輪廓點集) hull = cv2.convexHull(cnt)

C++ (方法基本共用,函數名也差不多,略有差異)

//Mat新建

Mat src = imread("csdn.png");//讀圖新建

// 默認構造函數 Mat A;
    Mat ()
    // 常用構造函數 Mat A(10,10,8UC3);
    Mat (int rows, int cols, int type)

    //Mat A(300, 400, CV_8UC3,Scalar(255,255,255));
    Mat (int ndims, const int *sizes, int type, const Scalar &s)

    Mat (Size size, int type)

    Mat (int rows, int cols, int type, const Scalar &s)

    Mat (Size size, int type, const Scalar &s)

    Mat (int ndims, const int *sizes, int type)

    Mat (const Mat &m)

    Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)

    Mat (Size size, int type, void *data, size_t step=AUTO_STEP)

    Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)

    Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())

    //Mat D (A, Rect(10, 10, 100, 100) );
    Mat (const Mat &m, const Rect &roi)

    Mat (const Mat &m, const Range *ranges)

//圖像

imread imread("../libo_resource/test.bmp", CV_LOAD_IMAGE_COLOR);//CV_LOAD_IMAGE_COLOR值爲1(默認)3通道, CV_LOAD_IMAGE_GRAYSCALE =0灰度單通道

namedWindow("display window", CV_WINDOW_AUTOSIZE);//CV_WINDOW_AUTOSIZE=1默認,可以全屏,但是圖像大小不變,不會插值適應全屏,CV_WINDOW_NORMAL = 0x00000000, 即可以全屏(自動插值)

imshow("display window", img);

imwrite("../libo_output/output.bmp", img);//資源保存在.cpp源文件所在目錄的上一級目錄的一個文件夾

 

waitKey(0);//waiting forever

//視頻記錄

VideoCapture cap(0);

VideoWriter wri;

frameWidth = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH)); frameHeight = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));

frameRate = cap.get(CV_CAP_PROP_FPS);

cap.open(0);//打開ID爲0的攝像頭文件,打開視頻文件爲,型如:cap.open("test_02.wmv");

//打開ID爲0的攝像頭文件,打開視頻文件爲,型如:cap.open("test_0//打開要寫入的視頻文件,準備寫入!編解碼方式參數設置爲-1,表示代碼運行時會彈出對話框,手動選擇編解碼方式
    //當讀出幀率爲0時,可改爲wri.open(outFile, -1, 25.0, frameSize, true);25.0對應的形參影響生產的文件的播放速度  
    wri.open(outFile, -1, 10.0, frameSize, true);
    //wri.open(outFile, -1, frameRate, frameSize, true);//true代表彩色輸出!

if (!cap.read(frame))//嘗試讀取下一幀

//釋放對象 waitKey(0); cap.release(); wri.release();

/// 轉換爲灰度圖 Mat src_gray; cvtColor(src, src_gray, CV_RGB2GRAY);後面的參數可改

//高斯模糊 GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);

//sobel x方向梯度 Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);

//sobel y方向梯度 Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);

//合併 addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, gradImage);

// 調用Canny函數邊緣檢測  cv::Canny(out, out, 100, 200);

// 對像素進行翻轉 cv::threshold(out, out, 128, 255, cv::THRESH_BINARY_INV);

//輸入按鍵 c = waitKey(0); c ==“a” 即可判斷輸入值

//設定鼠標相應函數 void on_mouse(int event, int x, int y, int flags, void* ustc)   cvSetMouseCallback("src", on_mouse, str);

CV_EVENT_MOUSEMOVE =0, //鼠標移動 其他類似

畫線 line(frame, beginPoint, endPoint, Scalar(255, 0, 0), 2);ellipse橢圓,rectaqngle矩形,circle圓,fillPoly多邊形

getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));

參數:

shape:表核的形狀,矩形MORPH_RECT;交叉形MORPH_CROSS;橢圓形MORPH_ELLIPSE;

ksize:核尺寸大小;

anchor:錨點的位置,錨點隻影響形態學運算結果的偏移;

//圖像腐蝕 element = getStructuringElement(MORPH_RECT,Size(15,15)) ; erode(srcImg,dstImg,element)

//圖像模糊 blur(srcImg,dstImg,Size(7,7));

 

SVM的主要思想可以概括爲兩點:

  1. 它是針對線性可分情況進行分析,對於線性不可分的情況,通過使用非線性映射算法將低維輸入空間線性不可分的樣本轉化爲高維特徵空間使其線性可分,從而使得高維特徵空間採用線性算法對樣本的非線性特徵進行線性分析成爲可能。

  2. 它基於結構風險最小化理論之上在特徵空間中構建最優超平面,使得學習器得到全局最優化,並且在整個樣本空間的期望以某個概率滿足一定上界。

近指針是16位的指針,它只表示段內的偏移地址,因而只能對64k字節數據段內地址進行存取。

遠指針是32位指針,它表示段地址:偏移地址遠指針可以進行跨段尋址,可以訪問整個內存的地址。

巨指針是32位的指針,它其實是規格化的指針,其實它與遠指針就差在規格化上面,遠指針沒有規格化

 

獲取時間getTickCount()返回時鐘的週期數,getTickFrequency()一秒週期數

計算運行秒 = (getTickCount(當前值) - getTickCount(初始的值))/getTickFrequency();

ROI(range of Interest)感興趣區域 = image(Rect(500,250),cols,rows);

加權和函數addWeighted(src1,alpha,src2,alpha2,gamma,dst,dtype) dst = src1*alpha+src2*alpha2+gamma;

可做簡單的圖像融合,合成

split(src,channels:vector<mat>)通道分離 

merge(channels:vector<mat>,dst)通道融合

傅里葉變換dft(drc,dst,int flags=0,int nonzeroRows=0)

獲得一個卷積核返回Mat類型值 getStructuringElement(MORPH_RECT矩形 MORPH_CROSS交叉形 MORPH_ELLIPSE橢圓,尺寸,錨點)

形態學morphologyEx(src,dst,int op, kernel, pointacnchor,int iterations,int bordeType,constScalar& borderValue)

開運算:先腐蝕再膨脹 可消除小物體

閉運算:先膨脹再腐蝕 排除小型黑洞

形態學梯度:是膨脹圖與腐蝕圖之差 可將團塊的邊緣突出出來

頂帽或禮帽:原圖像與開運算的結果之差 用於分離比鄰近點亮一些的斑塊

黑帽:閉運算的結果圖與原圖之差  突出了比原圖輪廓周圍更暗的區域,分離比鄰近點暗的斑塊

漫水填充:自動選中了和種子點相連的區域,接着將該區域替換成指定的顏色,用於標記或者分離圖像的一部分進行處理或分析

floodFill(src,mask,Point seedPoint,Scalar color,rect ,Scalar loDiff= Scalar(),Scalar upDiff=Scalar(),int flags=4)

高斯金字塔 用來向下採樣,先進行高斯內核卷積,在去除偶數行和列,向上採樣先擴大,以0填充在高斯卷積

拉普拉斯金字塔 用來從金字塔底層圖像重建上層未採樣圖像,預測殘差

pyrUP(src,dst,const Size& dsize=Size(),int borderType=BORDER_DEFAULT)向上採樣:圖像尺寸加倍

pyrDown向下採樣:圖像尺寸減半

尺寸調整resize(src,dst,Size dsize,double fx=0,double fy=0,int interpolation =INTER_LINEAR)

閾值Thhreshold(src,dst,double thresh,double maxval,int type)函數對單通道數組應用固定閾值操作,得到二值圖像

Sobel算子

Laplacian算子

scharr濾波器

霍夫變換分爲,標準,多尺度,累計概率霍夫變換,檢測圖像中的直線,原理需瞭解

HoughLines(src,outputArray lines,double rho距離精度,double theta 角度精度,int threshold 累加閾值, double srn =0, double stn = 0);

HoughCircles(sec,outputArray circles, int method,double dp檢測圓心的分辨率,double minDist最小圓心間距,double param1前method的參數,double param2, int minRadius, int maxRadius)

重映射:dst(x,y) = src(mapx(x,y),mapy(x,y))  如翻轉;mapx,y爲映射座標集

調用函數ramap(src,dst,inputArray map1,inputArray map2,int interpolation插值方式,int borderMode, const Scalar& borderValue)

仿射變換:點乘以變換矩陣

warpAffine(src,dst,InputArray M,size dsize,int flags=INTER_LINEAR,int borderMode=BORDER_CONSTANT,const Scalar& borderValues=Scalar())

getRotationMatrix2D(Point2f center, double angel,double scale)獲取旋轉縮放的矩陣

直方圖均衡化equalizeHist(src,dst)

找到輪廓,存在contours點數組中,hierarchy表示輪廓的拓撲信息(父輪廓,內嵌輪廓等)

findCountours(src,outputArrayofArrays contours,outputArray hierarchy,int mode, int method, Point offset=Point())

繪製輪廓drawContours(src, contours,contourIdx, color,int thickness =1,int lineType=8,inputArray hierarchy= noArray(),int maxLevel =INT_MAX,Point offset= Point())

凸包 :輸入點集,尋找點集的凸包,返回hull內,

convexHull(inputArray points, outputArray hull, bool clockwise=fales是否順時針,bool returnPoints=true是否返回凸包點)

返回外部矩形邊界Rect  boundingRect(InputArray points)

尋找最小包圍矩形RotateRect minAreaRect(InputArray points)

尋找最小包圍圓形 void minEnclosingCircle(InputArray points, Point2f& center,float& radius);

橢圓擬合二維點集 RotateRect fitEllipse(inputArray points)

逼近多邊形曲線 void approxPolyDP(intoutArray curve, ouputArray approxCurve,double epsilon, bool closed)

零階矩表示它的總質量;一階矩表示它的質心;二階矩又叫慣性矩,表示圖像的大小和方向。

矩的計算:Moment  moments(InputArray array圖, bool binary Image =false)

計算輪廓面積:double contourArea(inputArray cotour, bool oriented= false)

計算輪廓長度: arcLength(inputArray curve, bool closed)

分水嶺算法:分割圖像watershed (src, InputOutputArray markers);

圖像修補:inpaint(src, inpainMask, dst,double inpaintRadius, int flags方法)

計算直方圖:calcHist(const Mat* images圖像組,int nimages圖片數量,const int* channels通道數組,inputArray mask掩碼,outputArray hist輸出二維數組, int dims直方圖維度,const int* histSize直方圖尺寸數組,const float** ranges每一維數據的取值範圍,bool uniform=true是否有標識符,bool accumulate=false累積標識符)

直方圖將圖像的強度(數值)劃分爲指定數量的等級,劃分的屬性是什麼直方圖calcHist函數並不知道,決定於輸入的數據含義是什麼。

在數組中尋找最值:minMaxLoc(inputArray src, double* minVal最值指針,double *maxVal=0,Point* minLoc=0二維最值指針,Point* maxLoc=0,inputArray mask=noArray())

比較直方圖compareHist(InputArray H1, InputArray H2, int method)或compareHist(const SparseMat& H1,const SparseMat& H2,int method)比較方法CV_COMP_XXX具體自己查

反向投影:首先計算出原圖像直方圖的分佈圖像,利用直方圖作爲概率映射圖。對測試圖像的每個像素,得到像素值(h,s)在直方圖中找到概率數值,記錄在最終顯示的該像素的位置,表示該像素屬於原圖像的概率。

calcBackProject(const Mat* images輸入圖像組,int nimages數量,const int* channels通道索引, InputArray hist輸入的直方圖, OutputArray backProject輸出的反向投影陣列, const float **ranges每一維度的取值範圍, double scale =1縮放 ,bool uniform = true是否有標識符);

通道複製:mixChannels(const Mar* src,size_t nsrcs 輸入矩陣數, Mat* dst輸出數組,size_t ndsts輸出矩陣數,const int* fromTo數組索引, size_t npairs索引數量)
模板匹配:模板在圖像中上下滑動找到最佳的匹配matchTemplate(inputArray image,InputArray temp1,OutputArray result,int method)方法具體自己查CV_TM_XXX

角點檢測:分爲幾種:一階導數的局部最大所對應的像素點;2.兩條或兩條以上邊緣的交點;3.圖像中梯度值和梯度方向的變化速率都很高的點;4.交點處的一階導數最大,二階導數爲零,它指示了物體邊緣變化不連續的方向;

Harris角點檢測:cornerHarris(inputArray src,outputArray dst,int blockSize領域大小, int ksize,double k,int borderType=BORDER_DEFAULT)

Shi-Tomasi角點檢測:goodFeaturesToTrack(inputArray image,outputArray corners,int maxCorners,double qualityLevel,double minDistance,InputArray mask = noArray(),int blockSize =3,bool useHarrisDetector = false,double k =0.04)

亞像素角點,精確的角點位置:cornerSubPix(src,size winSize ,size zeroZone termcriteria criteria)

特徵檢測:特徵檢測之後得出keyPoint數組,匹配過程針對keypoints

SURF特徵點檢測:1構建Hessian矩陣構造高斯金字塔尺寸空間,2利用非極大值抑制初步確定特徵點3精確定位極值點4選取特診點的方向5構造surf特徵點描述算子

話關鍵點drawKeyPoints(const Mas&image, const vector<KeyPoint>& keypoints,Mat& outImage,const Scalar& color=Scalar::all(-1), int flags = DrawMatcheesFlags::DEFAULT)

KeyPoint{ point2f pt座標,float size 特徵點領域直徑,float angle方向,float response,int octave特徵點所在的圖像金字塔的組,int class_id 用於聚類的id)

繪製匹配點:drawMatches(const Mat& img1,const vector<Keypoint>& k1,const Mat&img2,const vecotr<keyPoint>& k2,...)

找到最佳匹配:DescriptorMatcher::match(const Mat& queryDescriptors查詢描述符集,const Mat& trainDescriptors,訓練描述符集,vector<DMatch>& matches得到的匹配,const Mat& mask =Mat())

ORB特徵提取:在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進制串,並將這個二進制串作爲該特徵點的特徵描述子。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章