opencv

opencv3编译
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/storage/workspace/xxx/opencv-3.3.0/build -D WITH_CUDA=OFF -D OPENCV_EXTRA_MODULES_PATH=/storage/workspace/xxx/opencv_contrib/modules ..

opencv-python选择ROI
  1. 矩形选择框
import cv2
import imutils
 
img = cv2.imread("./test_image.jpg")
img = imutils.resize(img, width=500)
 
roi = cv2.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
 
cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
cv2.imshow("roi", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  1. 多边形选择框,主要利用鼠标交互进行绘制:
    • 单击左键,选择多边形的点;
    • 单击右键,删除最近一次选择的点;
    • 单击中键,确定ROI区域并可视化。
    • 按”S“键,将多边形ROI区域的点保存到本地”config.pkl"文件中。
import cv2
import imutils
import numpy as np
import joblib
 
pts = []  # 用于存放点
 
 
# 统一的:mouse callback function
def draw_roi(event, x, y, flags, param):
    img2 = img.copy()
 
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点
        pts.append((x, y))  
 
    if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点
        pts.pop()  
 
    if event == cv2.EVENT_MBUTTONDOWN:  # 中键绘制轮廓
        mask = np.zeros(img.shape, np.uint8)
        points = np.array(pts, np.int32)
        points = points.reshape((-1, 1, 2))
        # 画多边形
        mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)
        mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROI
        mask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0))  # 用于显示在桌面的图像
 
        show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)
 
        cv2.imshow("mask", mask2)
        cv2.imshow("show_img", show_image)
 
        ROI = cv2.bitwise_and(mask2, img)
        cv2.imshow("ROI", ROI)
        cv2.waitKey(0)
 
    if len(pts) > 0:
        # 将pts中的最后一点画出来
        cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)
 
    if len(pts) > 1:
        # 画线
        for i in range(len(pts) - 1):
            cv2.circle(img2, pts[i], 5, (0, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标
            cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)
 
    cv2.imshow('image', img2)
 
 
# 创建图像与窗口并将窗口与回调函数绑定
img = cv2.imread("./test_image.jpg")
img = imutils.resize(img, width=500)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")
print("[INFO] 按‘S’确定选择区域并保存")
print("[INFO] 按 ESC 退出")
 
while True:
    key = cv2.waitKey(1) & 0xFF
    if key == 27:
        break
    if key == ord("s"):
        saved_data = {
            "ROI": pts
        }
        joblib.dump(value=saved_data, filename="config.pkl")
        print("[INFO] ROI坐标已保存到本地.")
        break
cv2.destroyAllWindows()

imread指定读取区域,注意坐标
img_data = cv2.imread('test.jpg')
shape = img_data.shape#(h,w)
region = [1,2,100,101]#以左上角为原点,水平方向为x轴,垂直方向为y轴 (x1,y1,x2,y2)
img_data = img_data[region[1]:region[3],region[0]:region[2]]
cv2.findContours()函数
findContours(image, mode, method, contours=None, hierarchy=None, offset=None):

opencv2返回两个值:contours:hierarchy。注:opencv3会返回三个值,分别是img, countours, hierarchy

第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
    cv2.RETR_EXTERNAL表示只检测外轮廓
    cv2.RETR_LIST检测的轮廓不建立等级关系
    cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
    cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的近似办法:
    cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
    cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法```


例子

#-*-coding:utf-8-*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = np.zeros((1600,1600))
cnt = np.array([[100,100],[200,200],[600,800],[600,1500],[200,800]])
rect,shape,theta = cv2.minAreaRect(cnt)
box = cv2.boxPoints((rect,shape,theta))
print(box)#(左下,左上,右上,右下)
box = np.int0(box)
cv2.drawContours(img, [cnt], 0, (255, 0, 0), 3)
cv2.drawContours(img, [box], 0, (155, 0, 0), 4)
#cv2.imwrite('contours.png', img)
plt.imshow(img)
plt.show()
#####################################################
# import cv2
# im = cv2.imread('contours.png')
# img = cv2.resize(im,(0,0),fx=0.5,fy=1)
# print(img.shape)

[[ 600.00006 1500. ]
[-126.153854 229.2307 ]
[ 175.38464 56.923096]
[ 901.5386 1327.6924 ]]

cv2.imread
im = cv2.imread(path)

h,w,c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值