cv2.drawContours isn't displaying correct color
Asked Answered
K

1

6

I am trying to determine the width of an artery and have made a very rough program to verify that drawContours is appropriate. My problem is that the contour is only only printing black or white lines as opposed to the colored lines I am trying to use. I am unsure if the img I am drawing on is limited to bw or I have the contour set up wrong. The second image is the contours appended to the original image. Outputted Images

import cv2
import numpy
from FileSupport import *

# Declared Variables ###########################
# file vars
image_file_name = '14.05.25 hrs __[0011697].avi'  # this will be given through some file selection of the user
temp_image_file_path = ReturnTempImagePath()  # gives file path for .avi files to be stored
# image vars
sample_start_row = 144  # measurements are based off the 640x480 sample image
sample_end_row = 408
sample_start_col = 159
sample_end_col = 518
# colors
RED = (0, 0, 255)  # opencv uses BGR not RGB
GREEN = (0, 255, 0)
BLUE = (255, 0, 0)

# Pull image ###################################
print("Getting image from ", image_file_name, "\n")

artery_vid = cv2.VideoCapture(ReturnImagePath(image_file_name))
if not artery_vid.isOpened():
    print("Couldn't open file")
    sys.exit()

success, image = artery_vid.read()
i_frame = 0
while success:
    image = image[sample_start_row:sample_end_row, sample_start_col:sample_end_col]
    cv2.imwrite(temp_image_file_path + "frame%i.jpg" % i_frame, image)

    # -----Just trying to draw around artery-------
    img = cv2.imread(temp_image_file_path + "frame%i.jpg" % i_frame, cv2.IMREAD_GRAYSCALE)
    hierarchy, threshold = cv2.threshold(img, 120, 200, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    cv2.imshow("Image Without Contours", image)  # contour is also destructive
    cv2.drawContours(img, contours, -1, GREEN, 2)  # I am expecting the contour lines to be green
    cv2.imshow("Image With Contours", img)
    cv2.imshow("Threshold Image", threshold)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # ---------------------------------------------

    print("Image %i Complete" % i_frame, "\n")
    i_frame += 1
    success, image = artery_vid.read()
Kailyard answered 20/11, 2019 at 16:49 Comment(0)
U
16

Your image is in grayscale, so you need to convert it to BGR prior to drawing contours in color.

contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.imshow("Image Without Contours", image)  # contour is also destructive

img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)  #add this line

cv2.drawContours(img, contours, -1, GREEN, 2)  # I am expecting the contour lines to be green
Unplug answered 20/11, 2019 at 17:2 Comment(1)
This was perfectKailyard

© 2022 - 2024 — McMap. All rights reserved.