我有兩個影像,我們稱它們為影像 1 和影像 2。我可以使用以下內容在影像 1 中選擇一個隨機特征并顯示它:
segall_prev = cv2.imread(str(Path(seg_seg_output_path, prev_filename)), 0);
segall_prev = np.uint8(segall_prev)
ret, thresh = cv2.threshold(segall_prev, 127, 255, 0)
numLabels, labelImage, stats, centroids = cv2.connectedComponentsWithStats(thresh, 8)
# Pick random prev-seg feature
random_prev_seg = random.randint(0, np.amax(labelImage))
i = np.unique(labelImage)[random_prev_seg]
pixels = np.argwhere(labelImage == random_prev_seg)
labelMask = np.zeros(thresh.shape, dtype="uint8")
labelMask[labelImage == i] = 1
numPixels = cv2.countNonZero(labelMask)
# Display chosen feature from prev_seg image only
fig_segall_prev = plt.figure()
fig_segall_prev_ = plt.imshow(labelMask)
plt.title(prev_filename ' prev_seg')
這將顯示一個影像,例如:

所以想法是這是前一幀的特征(圖 1),然后用戶將選擇該特征在下一幀中的位置(圖 2) - 基本上是跨幀跟蹤物件。
# Display seg image and allow click
seg_ret, seg_thresh = cv2.threshold(segall, 127, 255, 0)
seg_numLabels, seg_labelImage, seg_stats, seg_centroids = cv2.connectedComponentsWithStats(seg_thresh, 8)
mutable_object = {}
def onclick(event):
# Capture click pixel location
X_coordinate = int(event.xdata)
Y_coordinate = int(event.ydata)
mutable_object['click'] = X_coordinate
print('x= ' str(X_coordinate))
print('y= ' str(Y_coordinate))
# Compare captured location with feature locations
x = np.where(seg_labelImage == 1)
#print(x[0])
if X_coordinate in x[0] and Y_coordinate in x[1]:
print('yes')
fig_segall = plt.figure()
cid = fig_segall.canvas.mpl_connect('button_press_event', onclick)
fig_segall_ = plt.imshow(seg_labelImage)
plt.title(filename ' seg')
當顯示影像 2 時,如下所示:

所以我的問題是,如何捕獲用戶在第二張影像中單擊的位置,然后檢查這些 xy 坐標是否對應于 cv2.connectedComponentsWithStats 找到的特征位置?然后,我需要將該特征保存為單獨的影像,然后使用所選特征的位置在相應的彩色影像中使用。
如果有人可以提供幫助或建議改進代碼的方法 - 因為它非常混亂,因為我已經嘗試了幾個小時來解決這個問題......那將不勝感激。謝謝!
解決方案(感謝 asdf):
seg_numLabels, seg_labelImage, seg_stats, seg_centroids = cv2.connectedComponentsWithStats(seg_thresh, 8)
selected_features = {}
def onclick(event):
# Capture click pixel location
X_coordinate = int(event.xdata)
Y_coordinate = int(event.ydata)
print(f'{X_coordinate=}, {Y_coordinate=}')
obj_at_click = seg_labelImage[Y_coordinate, X_coordinate] # component label at x/y, 0 is background, above are components
if obj_at_click != 0: # not background
# clicked on a feature
selected_feature = np.unique(seg_labelImage) == obj_at_click # get only the selected feature
selected_features[filename] = selected_feature
print(f'Saved feature number {obj_at_click}')
else:
print('Background clicked')
# Display seg image
fig_segall = plt.figure()
fig_segall.canvas.mpl_connect('button_press_event', onclick)
plt.imshow(segall)
plt.title(filename ' seg')
uj5u.com熱心網友回復:
cv2.connectedComponentsWithStats1用從到的數字標記二進制影像的所有連接組件n_components(0是背景)。因此,您只需要檢查滑鼠單擊的x和y坐標是否位于分段組件內。以下代碼應演示如何獲取被單擊組件的二進制掩碼:
selected_features = {}
img_name = 'example1'
def onclick(event):
# Capture click pixel location
X_coordinate = int(event.xdata)
Y_coordinate = int(event.ydata)
print(f'{X_coordinate=}, {Y_coordinate=}')
obj_at_click = seg_labelImage[y, x] # component label at x/y, 0 is background, above are components
if obj_at_click != 0: # not background
# clicked on a feature
selected_feature = seg_labelImage == obj_at_click # get only the selected feature
selected_features[img_name] = selected_feature
print(f'Saved feature number {obj_at_click}')
else:
print('Background clicked')
我無法測驗代碼,而且我從未使用過 matplotlib 事件,所以我可能是回傳的點擊坐標需要偏移或縮放以獲得正確的影像坐標。您可能希望以原始大小顯示影像并且沒有刻度標簽等。這個stackoverflow 答案可能會幫助您。
如果我沒有正確回答您的問題,請告訴我!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/492808.html
上一篇:使用未使用的功能失敗
下一篇:計算影像兩半的像素比
