OPenCv基础代码

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

#读取图像cv.imread()

#读取图像cv.imshow()

#绘制直线 cv.line(img,start,end,color,thickness)

#绘制圆形 cv.circle(img,centerpoint, r, color, thickness)

#绘制矩形 cv.rectangle(img,leftupper,rightdown,color,thickness)

#向图像中添加文字 cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)


# 1 创建一个空白的图像
# img = np.zeros((512,512,3), np.uint8)
# # 2 绘制图形
# cv.line(img,(0,0),(511,511),(255,0,0),5)
# cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
# cv.circle(img,(447,63), 63, (0,0,255), -1)
# font = cv.FONT_HERSHEY_SIMPLEX
# cv.putText(img,'赵慕溪',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
# # 3 图像展示
# plt.imshow(img[:,:,::-1])
# plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
# plt.show()




# 1 读取图像
# img1 = cv.imread("view.jpg")
# img2 = cv.imread("rain.jpg")

# # 2 加法操作
# img3 = cv.add(img1, img2)  # cv中的加法
# img4 = img1 + img2  # 直接相加
#
# # 3 图像显示
# fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
# axes[0].imshow(img3[:, :, ::-1])
# axes[0].set_title("cv中的加法")
# axes[1].imshow(img4[:, :, ::-1])
# axes[1].set_title("直接相加")
# plt.show()

# 2 图像混合
# img3 = cv.addWeighted(img1, 0.5, img2, 0.5, 0)
#
# # 3 图像显示
# plt.figure(figsize=(8, 8))
# plt.imshow(img3[:, :, ::-1])
# plt.show()

# img = cv.imread("sheep3.png")
# #水平方向堆叠5张
# imgHor = np.hstack((img, img, img, img, img, img, img, img, img, img, img, img, img))
# # 垂直方向堆叠3张
# imgVer = np.vstack((img, img, img, img, img, img, img, img))
#
# cv.imshow("Horizontal", imgHor)
# cv.imshow("Vertical", imgVer)
# cv.waitKey(0)


# # # 原始图像
# img = cv.imread(".#1113.jpg")
# # # HSV图像, 把BGR通道转变成HSV
# imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)
#
# cv.imshow("Original", img)
# cv.imshow("HSV", imgHSV)
# cv.waitKey(0)


## 图片尺寸减小函数(计算机屏幕看着太大,所以减小,你可以不减小)



def getContours(img):
    # findContours()接收的是二值黑白图, 所以整个代码最下面调用getContours函数时传入的图片是imgCanny, imgCanny是二值黑白图(忘记的点击目录看第6个)
    # 返回两个:轮廓本身,轮廓属性
    # 参数:寻找轮廓的图像,检索外轮廓(轮廓检索模式),存储所有的轮廓点(轮廓的近似办法)
    contours, hierarchy = cv.findContours(img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
    for cnt in contours:
        # 计算轮廓面积
        area = cv.contourArea(cnt)
        # 画出轮廓面积大于2000的轮廓(筛选一下)
        if area > 2000:
            # 参数:待画轮廓图像,待画轮廓,轮廓索引(-1
            #表示都画),轮廓颜色, 轮廓线条粗细
            cv.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)
            # 计算轮廓的周长
            peri = cv.arcLength(cnt, closed=True)
            # 判断点到相对应的line segment 的距离的阈值。
            # 距离大于此阈值则舍弃,小于此阈值则保留,epsilon越小,折线的形状越“接近”曲线。
            approx = cv.approxPolyDP(cnt, 0.02 * peri, closed=True)
            # 每个图形,角的个数
            objCor = len(approx)
            # 获得每个图形角外套的框的左上角坐标,以及w,h
            x, y, w, h = cv.boundingRect(approx)
            # 如果顶角数为3,判定为三角形
            if objCor == 3:
                objectType = "Tri"
            # 如果顶角数为4
            elif objCor == 4:
                aspRatio = w / h
                # 如果0
                #.95 < 宽高比 < 1.05,就是正方形(因为实际图片长宽不一定完全相等)
                if aspRatio > 0.95 and aspRatio < 1.05:
                    objectType = "Square"
                # 不在这个范围,基本判定为长方形
                else:
                    objectType = "Rectangle"

        # 如果大于4, 就是圆形
            elif objCor > 4:
                objectType = "Circle"
        # 如果有其它情况,标注为None
            else:
                objectType = "None"
            # 画框,参数:待画框的图,框左上角,右下角的坐标,框的颜色,框的粗细
            cv.rectangle(imgContour, (x, y), (x + w, y + h), (0, 255, 0), 2)
            # 添加文字,参数:待画框的图,文本信息,文本左下角的坐标(w, h),字体,字体大小,字体颜色,字体粗细
            cv.putText(imgContour, objectType, int((x + (w / 2) - 10), int(y + (h / 2) - 10)), cv.FONT_HERSHEY_COMPLEX, 0.8,
                        (0, 0, 0), 2)

img = cv.imread("shapes3.png")
# 拷贝一份彩图,轮廓,检测框,文字都要添加再这张图上
imgCanny = cv.Canny(img, 200, 250)
imgContour = img.copy()
getContours(imgCanny)


def image_process(img, size):
    imgResize = cv.resize(img, (int(img.shape[1] * size), int(img.shape[0] * size)))
    return imgResize

# 原图尺寸缩小为原来的0.6倍
cv.imshow("Original", image_process(img, 0.6))
cv.waitKey(0)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ISDF-工软未来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值