Reputation:
I am trying to find a highest point of an object in a mask of bitwise. I researched and found this question i did exactly as the answer said but the results were just (0,0) which are wrong
I am just trying in the same image as the question
Here is the code for that
import cv2
import numpy as np
def line(im, pt1, pt2, color, thickness):
im = cv2.line(im, pt1, pt2, color=color, thickness=thickness, lineType=cv2.LINE_AA)
return im
def empty(a):
pass
path = 'images/m_1.jpg'
global img
img = cv2.imread(path)
img = cv2.resize(img, (640, 480))
org_img = img.copy()
copy_img = img.copy()
img_blur = cv2.blur(img,(5,5))
imgHSV = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)
h_min = 0
h_max = 179
s_min = 0
s_max = 255
v_min = 48
v_max = 166
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(imgHSV, lower, upper)
global imgResult
imgResult = cv2.bitwise_and(img, img, mask=mask)
imgResult = cv2.resize(imgResult, (640, 480))
cont, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
c = max(cont, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
image = cv2.line(img, (int(w/2),y), (int(w/2),y+h), (0,0,255), 2)
global cropped_img
cropped_img = copy_img[y:y + h, x:x + w]
draw_img = np.zeros((img.shape[0], img.shape[1], img.shape[2]), dtype="uint8")
cv2.drawContours(draw_img,[c],-1,(255,255,255),thickness=-1)
img_bitwise = cv2.bitwise_and(org_img, draw_img)
margin = 90
draw_img = draw_img[margin:-margin]
imgResult = imgResult[margin:-margin]
img = img[margin:-margin]
img_bitwise = img_bitwise[margin:-margin]
print(draw_img.shape[:2])
has_white = print(np.any(draw_img, axis=1))
print(np.argmin(has_white))
result_i = np.argmin(has_white)
print(np.argmin(img_bitwise[result_i,:]))
cv2.imwrite('bit_img.png',img_bitwise)
cv2.imshow("Track Images", imgResult)
cv2.imshow("Result Images", img)
cv2.imshow("Cropped Image", cropped_img)
cv2.imshow("Draw Image", draw_img)
cv2.imshow("bit_img", img_bitwise)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite(r'C:\Users\Anush\PycharmProjects\WeldPoolAnalysis\resultImages\imgResult.png', img)
cv2.imwrite(r'C:\Users\Anush\PycharmProjects\WeldPoolAnalysis\resultImages\imgCropped.png', cropped_img)
cv2.destroyAllWindows()
Output Of The Script
(300, 640)
[[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[False False False]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[ True True True]
[False False False]
[False False False]
[False False False]
[False False False]]
0
0
Upvotes: 0
Views: 1211
Reputation: 579
This line has_white = print(np.any(draw_img, axis=1))
doesn't make much sense because what you store in has_white
is the result of print()
, which is None
. Try changing:
has_white = print(np.any(draw_img, axis=1))
print(np.argmin(has_white))
to:
has_white = np.any(draw_img, axis=(1, 2))
print(np.argmax(has_white))
Now you are taking np.any
over multiple axes, and has_white
will contain a value for each row that is True
if the row contains white or False
otherwise.
The next line uses np.argmax()
rather than np.argmin()
. This means it finds the maximum of your array (your array only contains True
and False
so the max will be True
) and returns the first index of a row that contains that max value. Since the array contains True
where you have white, this will be first row containing white.
Therefore it will print the row of your highest point in draw_img
. Since you have applied a margin, draw_img
is smaller than your input, so you will need to account for that.
Now that you have the row, you can find the column.
row_index = np.argmax(has_white)
column = draw_img[row_index]
column_has_white = np.any(column, axis=1)
column_index = np.argmax(column_has_white)
One end of your line is (row_index, column_index)
and the other is (draw_img.shape[0], column_index)
.
Upvotes: 1