이번 영상에서는 OpenCV를 사용하여 파란공의 위치를 트래킹하여 영상에 그림을 그려보는 코드를 소개합니다.
작성 2020. 3. 26
'OpenCV > OpenCV 프로젝트' 카테고리의 다른 글
OpenCV Python 사용하여 스티칭(stitching) 구현하기 (2) | 2020.04.30 |
---|---|
화면 캡처한 결과를 입력으로 하여 OpenCV Python에서 템플릿 매칭해보기 (3) | 2020.04.09 |
OpenCV 기반으로 파란공 트래킹(tracking)하여 그림 그리기 (50) | 2020.03.26 |
OpenCV를 사용하여 바닥에 놓인 트럼프 카드(Playing Card) 인식하기 (6) | 2020.03.18 |
OpenCV를 사용하여 손 검출 및 인식하기(Hand Detection and Recognition using OpenCV) (53) | 2019.09.24 |
OpenCV를 사용하여 책 검출하기(book detection with OpenCV) (1) | 2019.09.17 |
OpenCV를 사용하여 얼굴에 선글라스 씌우기 (49) | 2019.06.09 |
OpenCV C++ 차선인식 코드 (119) | 2018.09.17 |
포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.
여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다.
감사합니다 ~~
유튜브 구독하기
제가 쓴 책도 한번 검토해보세요 ^^
-
Han 2020.05.28 04:27
안녕하세요. 공부하면서 유툽 자주 보는 구독자 입니다.
항상 올려주시는 영상 감사히 보고 있습니다.
다름이 아니라 해당 코드를 파이참에서 실행하면
cv.imshow('Result', img_color)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
이 에러가 뜨면서 윈도우 창이 열렸다가 바로 꺼집니다 ㅜㅜ
현재 제 opencv버전은 4.2.0이고 파이썬은 3.7.7입니다.
(버전 문제인지 해당 코드의 cv2.flip()이 존재하지 않는다 하여 그 부분만 주석처리 했습니다. 화면을 안 뒤집고 사용하려구요)
테스트 코드로 혹시 웹캠이 아예 작동하지 않나, 확인해봤는데
videocapture(), read()를 사용해 동영상 촬영 시 imshow()가 정상적으로 실행됩니다...
어떤 문제점이 있는지 궁금해서 댓글 남깁니다.
답글 달아주시면 감사하겠습니다.-
Han 2020.05.29 01:56
답변 정말 감사합니다!!
이상하게 draw_ball_location() 만 다녀오면 저 오류가 떠서 함수를
# 기존
def draw_ball_location(img_color, locations):
for i in range(len(locations) - 1):
if locations[0] is None or locations[1] is None:
continue
cv.line(img_color, tuple(locations[i]), tuple(locations[i+1]), (0, 255, 255), 3)
return img_color
# 수정
def draw_ball_location(img_color, locations):
for i in range(len(locations) - 1):
if locations[0] is None or locations[1] is None:
continue
cv.line(img_color, tuple(locations[i]), tuple(locations[i+1]), (0, 255, 255), 3)
#return img_color
이렇게 바꿔서 처리하니까 잘 동작합니다!
다시 한 번 조언 정말 감사드립니다.
-
다승 2020.05.28 11:31
재밌게 잘 봤습니다.
응용해서 그레이 스케일에서 흰 공만 검출하려고 하는데요. (배경은 비교적 어두움) 몇 번 실패했네요 ㅠㅠ
어떻게 하면 할 수 있을까요?
-
다승 2020.05.30 17:56
답변 감사합니다. 하지만 제가 많이 부족해서 아직 해결이 안 됐네요.
https://www.youtube.com/watch?v=bZQllT4BdiY
이런 흑백의 초고속 영상에서 공이 손을 떠날 때 시간을 리턴하려고 합니다.
올려주신 걸 보고 차영상(배경제거)를 한 뒤 원을 검출하려고 했는데 해결이 잘 안되네요.
img_hsv = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY)
img_mask = cv.inRange(img_hsv, 250, 255)
kernel = cv.getStructuringElement( cv.MORPH_ELLIPSE , ( 5, 5 ) )
차영상에서 몸통도 움직여서 그쪽에 잡히는 경우가 있어서요. (이건 엄밀히 타원도 아닌데 잡혀서ㅠㅠ)
혹시 도움 좀 받을 수 있을까요?
-
LEE 2020.05.31 15:54
안녕하세요 ! 저 궁금한 점이 있어서 문의 드립니다 !
다름이 아니고, 원의 원점 좌표를 PUT TEXT를 사용하여 화면에 나타내고 싶은데, 아무리 해도 안되네요ㅜㅜ
원점 좌표를 나타내려면 어떻게 해야할지 궁금합니다ㅜ -
-
하루하루 2020.08.11 15:59
안녕하세요! 항상 감사히 보고 있습니다.
videocapture(0)를 사용해서 실시간(동영상)으로 검출하는게 아닌
1초마다 사진을 찍어, 이미지데이터를 띄우는 방법은 없을까요 ?
감사합니다! -
liberty67 2020.09.28 22:54
항상 정보 감사합니다.
위 예제에서 draw_ball_location 함수가 튜플을 사용하고 있는데 C++에서 구현하는 경우는 어떤 자료형을 사용해야 할까요??
제가 파이썬과 C++가 익숙하지 않아 질문드립니다.
-
liberty67 2020.09.29 11:42
답변 감사드립니다.
draw_ball_location(Mat img_color, vector<int> locations) {
for (int i = 0; i < locations.size(); i++) {
line(img_color, Point(locations[i],locations[i+1]), Point(locations[i+2],locations[i+3]), Scalar(0,255,0),2);
}
저는 이렇게 함수를 만들어봤는데 벡터로 line함수를 이용할 수 있을까요?
제가 아직 초보라 미숙한 부분이 많습니다.-
liberty67 2020.09.30 13:40
답변빠르게 주셔서 정말 감사합니다.
한가지 더 여쭤보고싶습니다.
def draw_ball_location(img_color, locations):
for i in range(len(locations)-1):
if locations[0] is None or locations[1] is None:
continue
cv.line(img_color, tuple(locations[i]), tuple(locations[i+1]), (0, 255, 255), 3)
return img_color
이 코드에서
if locations[0] is None or locations[1] is None:
continue
코드는 필수적으로 작성되어야 하는 코드인가요? -
liberty67 2020.09.30 14:40
Mat draw_ball_location(Mat& img_color, vector<Point> locations) {
for (int i = 0; i < locations.size(); i++) {
if (locations.at(0) == Point(0,0) || locations.at(1) == Point(0,0))
continue;
line(img_color, locations.at(i), locations.at(i+1), Scalar(0,255,0),2);
}
return img_color;
}
예제를 참고하여 제가 작성해본 함수입니다. 프로그램 실행 후 파란물체를 캡처했을 때 abort() has been called 메시지와 함께 프로그램이 종료됩니다. 혹시 예외처리나 line함수 사용에 문제가 있는 상황일까요? -
liberty67 2020.09.30 15:27
계속해서 귀찮게 해드려 정말 죄송합니다..
for ball_locations in history_ball_locations:
img_color = draw_ball_location(img_color, ball_locations)
예제의 코드를 다음과 같이 작성해밨습니다.
for (Point ball_locations : history_ball_location) {
img_result = draw_ball_location(img_color, ball_locations);
}
제가 만든 draw_ball_location 함수는 두번째 아규먼트로 vector<Point>를 받고 있습니다. 해결방법을 모르겠는데 혹시 어떻게 해결할 수 있을까요??
-
-