检测4个有趣的像素

2024-04-16 12:34:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我用OpenCV看了这张照片:

enter image description here

我检测其中物体的边界并显示图片:

enter image description here

这是我的密码:

import cv2
import numpy as np
from matplotlib import pyplot as plt


im=cv2.imread('db/4.jpg')
#mask=np.zeros(img.shape[:2],np.uint8)
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh=cv2.threshold(imgray,242,245,235)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

cv2.drawContours(im,contours,-1,(0,255,0),3)
cv2.imshow("GL",im)
cv2.waitKey(0)
cv2.destroyAllWindows()

我想做的是:

我想要4个像素的坐标属于其中一个轮廓,并且:

  • 第一个是X轴方向的壁橱
  • 第二个是离X轴最远的
  • 第三个是Y轴的壁橱
  • 第四个是离Y轴最远的

请注意,我的代码中可变的轮廓数可能会因我所读的图片而异。你知道吗


Tags: importasnp图片cv2opencv照片物体
1条回答
网友
1楼 · 发布于 2024-04-16 12:34:13

您可以将所有轮廓堆叠到一个数组green中,并搜索最小/最大x/y值:

green = np.vstack(contours).reshape((-1, 2))
print "Min X:", green[np.where(green[:, 0] == green[:, 0].min()), :]
print "Man X:", green[np.where(green[:, 0] == green[:, 0].max()), :]
print "Min Y:", green[np.where(green[:, 1] == green[:, 1].min()), :]
print "Man Y:", green[np.where(green[:, 1] == green[:, 1].max()), :]

请注意,特别是对于矩形,有多个像素满足您的要求,因为它们与x或y轴的距离相等。你知道吗

以下是“四”像素的可视化:

enter image description here

生成PyLab代码:

pl.imshow(im)
pl.gca().autoscale(False)
minX = np.where(green[:, 0] == green[:, 0].min())
maxX = np.where(green[:, 0] == green[:, 0].max())
minY = np.where(green[:, 1] == green[:, 1].min())
maxY = np.where(green[:, 1] == green[:, 1].max())
pl.plot(green[minX, 0], green[minX, 1], 'ro')
pl.plot(green[maxX, 0], green[maxX, 1], 'go')
pl.plot(green[minY, 0], green[minY, 1], 'bo')
pl.plot(green[maxY, 0], green[maxY, 1], 'yo')

相关问题 更多 >