Ошибки с кодом нет. Я переписал это, используя numpy срезов, чтобы заполнить части массива.
import cv2
import numpy as np
image = np.zeros((700,700),dtype=np.int32)
print(image.shape)
# cnt = np.array([[340, 157], [695, 157], [695, 309], [340, 309], [340, 157]])
image[157:309, 340:695] = 255
# image = cv2.fillPoly(image,[cnt],color=255)
print(image.shape)
a = np.zeros((10,10),dtype=np.int32)
a [2, 0:5] = 1
print(np.where(a>0)) #output_1
print(np.where(image==255)) #output_2
(array([2], dtype=int64), array([0], dtype=int64))
(array([157, 157, 157, ..., 308, 308, 308], dtype=int64), array([340, 341, 342, ..., 692, 693, 694], dtype=int64))
Если вы посмотрите на это, image[157:309, 340:695] = 255
срез по оси x описывается столбцами, и срез по оси Y по строкам. Часть cnt вашего кода описывает диапазон строк от 157-309 и диапазон столбцов от 340-695, и поэтому вывод.