幾個OPENCV常用算法(python版及C++版)

 python版本個人常用的

import cv2
import numpy as np


def show_img(name="", img="", x=0, y=0):
    cv2.namedWindow(name, 0)  # 創建圖像顯示窗口
    cv2.moveWindow(name, x, y)  # 設置窗口的位置,不然多張圖像顯示重疊
    cv2.imshow(name, img)  # 顯示圖像


img_src = cv2.imread("1.jpg", 1)  # 讀圖
cv2.medianBlur(img_src, 5)  # 濾波
show_img(name="src_img", img=img_src, x=0, y=0)

img_src = cv2.resize(img_src, (400, 400), cv2.INTER_AREA)  # 圖像大小縮放
h_flip = cv2.flip(img_src, 1)  # 翻轉 1:水平  0:豎直  -1:0&1

show_img(name="flip_img", img=h_flip, x=0, y=400)

img_black = np.zeros(img_src.shape, np.uint8)  # 創建黑圖 np.uint8

img_src = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)  # 顏色空間轉化

_, img_bin = cv2.threshold(img_src, 200, 255, cv2.THRESH_BINARY)  # 閾值分割

show_img(name="bin_img", img=img_bin, x=800, y=0)

kernel = np.ones((5, 5), np.uint8)  # 定義核
img_erode = cv2.erode(img_bin, kernel)  # 腐蝕 cv2.dilate 膨脹
# opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)  # 開閉運算 cv2.MORPH_CLOSE

show_img(name="erode_img", img=img_erode, x=1200, y=0)

cnt_, _ = cv2.findContours(img_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 查找邊緣
cv2.drawContours(img_black, cnt_, -1, (255, 255, 255), 1)

x, y, w, h = cv2.boundingRect(img_bin)  # 直接使用二值圖進行邊緣查找,得到包含整個圖像255像素的最大邊緣

cv2.line(img_black,(x,y),(x + w, y + h),(0,255,0), 3)
cv2.rectangle(img_black, (x, y), (x + w, y + h), (255, 0, 255), 1)  # 在黑圖上畫矩形多邊形cv2.polylines,橢圓cv2.ellipse
cv2.circle(img_black, (int(x+w/2),int(y+h/2)), 30, (0,0,213),-1)

font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img_black,'OpenCV',(80,90), font, 2,(255,255,255),3)  #寫字

for i in range(len(cnt_)):  # 根據查找的輪廓進行邊緣查找
    x, y, w, h = cv2.boundingRect(cnt_[i])  # 每一個輪廓查找一個包圍矩形 畫一個矩形
    cv2.rectangle(img_black, (x, y), (x + w, y + h), (0, 0, 255), 1)

show_img(name="black_img", img=img_black, x=400, y=0)

img_med = img_black[50: img_black.shape[0] - 50, 50: img_black.shape[1] - 50]  # 圖像截取 此處注意容易越界

show_img(name="med_img", img=img_med, x=400, y=400)

cv2.waitKey(5000)

# b = a.astype(np.uint8)  # 圖像轉化


以前用的C++

1、常用算法尋找邊界

std::vector<std::vector<cv::Point>> contours;

findContours( imgLast, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
		
cv::Mat imgMask( matBrokeRoi.size(), CV_8UC1, cv::Scalar(0) );

for ( unsigned int i=0; i < contours.size(); i++ )
{	

     double targetArea = contourArea(contours[i]);
     cv::Rect rect = cv::boundingRect(contours[i]);
     drawContours(imgMask, contours, (int)i, cv::Scalar::all(255), -1, 8);
}

 2、點中尋找最小包圍圓形

Point2f center;
float radius;
minEnclosingCircle(points, center, radius);

3.包含點的 最小矩形

rect = minAreaRect(InputArray points)

4.與四邊平行的正矩形

Rect boundingRect(InputArray points)

5.自定義卷積

#include <opencv2/opencv.hpp>
int main ()
{	
	cv::Mat imgSrc,imgGrad;
	imgSrc=cv::imread("12.jpg");

	cv::Mat fkernel = cv::Mat(2, 1, CV_32FC1, cv::Scalar(0) );

	fkernel.at<float>(0,0) =  -1;
	fkernel.at<float>(1,0) = 1;
	//Filter_kernel_Vert.at<float>(2,0) =  1;

	cv::resize( imgSrc, imgSrc, cv::Size( imgSrc.cols / 2, imgSrc.rows / 2 ) );
	cv::filter2D( imgSrc, imgGrad, imgSrc.depth(), fkernel  );
	cv::imshow("temp2",imgGrad);
	cv::waitKey(0);
	return 0;
}

6、膨脹 與腐蝕

cv::Mat KerForCannyEro = cv::Mat(3, 9, CV_8UC1, cv::Scalar(1) );
cv::dilate( matCanny, matCannyDilate, KerForCannyEro );
cv::erode(  matCanny, matCannyDilate, KerForCannyEro )

7、翻轉

cv::flip(imgSrc,imgOut,1);

 

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