在下列程式码中:
contours, h = cv2.findContours( img_bin, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE ) print(contours[0].shape)
输出为:
(299, 1, 2)
第二个值(等高线的索引1)代表什么?它总是等于1吗?
ttisahbt1#
OpenCV在numpy数组和cv::Mat之间Map,cv::Mat在内部和C++绑定中使用。cv::Mat具有宽度和高度以及多个通道。该形状被Map到一个形状为(H, W, C)的numpy数组,在两个方向上。如果OpenCV对你给予它的某个numpy数组很挑剔,它会帮助你将数据重新整形/转置到那个特定的形状。根据OpenCV约定,任何点列表通常表示为C通道元素(点)的列向量cv::Mat。因此,形状变为(N, 1, 2)当numpy数组的形状为(N, 2)时,OpenCV的Python绑定可能会将其解释为N乘2的单通道Mat。大多数/所有OpenCV API都隐式接受这种格式作为列向量格式的替代格式。来自findContours的contourslist(或tuple)包含了一堆numpy数组。每个轮廓都将始终具有(N, 1, 2)的形状,无论该特定轮廓中有多少点。您可以呼叫**.squeeze(axis=1)**方法来收合额外的维度。
cv::Mat
(H, W, C)
(N, 1, 2)
(N, 2)
findContours
contours
.squeeze(axis=1)
1条答案
按热度按时间ttisahbt1#
OpenCV在numpy数组和
cv::Mat
之间Map,cv::Mat
在内部和C++绑定中使用。cv::Mat
具有宽度和高度以及多个通道。该形状被Map到一个形状为
(H, W, C)
的numpy数组,在两个方向上。如果OpenCV对你给予它的某个numpy数组很挑剔,它会帮助你将数据重新整形/转置到那个特定的形状。根据OpenCV约定,任何点列表通常表示为C通道元素(点)的列向量cv::Mat。因此,形状变为
(N, 1, 2)
当numpy数组的形状为
(N, 2)
时,OpenCV的Python绑定可能会将其解释为N乘2的单通道Mat。大多数/所有OpenCV API都隐式接受这种格式作为列向量格式的替代格式。来自
findContours
的contours
list(或tuple)包含了一堆numpy数组。每个轮廓都将始终具有(N, 1, 2)
的形状,无论该特定轮廓中有多少点。您可以呼叫**
.squeeze(axis=1)
**方法来收合额外的维度。