Python/OpenCV : 캡처에서 찍은 이미지를 변환합니다
문제
캡처 (웹캠)에서 찍은 이미지를 변환하려고 노력하고 OpenCV로 처리를 수행하지만 어려운 시간을 보내고 있습니다.
이미지를 그레이 스케일로 변환하려고 할 때 프로그램이 충돌합니다. (Python.exe는 작동을 중지했습니다)
내 코드의 주요 스 니펫은 다음과 같습니다.
newFrameImageGS = cv.CreateImage ((320, 240), cv.IPL_DEPTH_8U, 1)
for i in range(0,5):
newFrameImage = cv.QueryFrame(ps3eye)
cv.CvtColor(newFrameImage,newFrameImageGS,cv.CV_BGR2GRAY)
golfSwing.append(newFrameImageGS)
CVConvertsCale을 사용하려고하면 어설 션 오류가 발생합니다.
src.size() == dst.size() && src.channels() == dst.channels()
말이되지만 웹 캠의 입력 이미지를 cvupdatemotionhistory () 및 cvcalcopticalflowlk ()와 같은 함수에서 사용할 수있는 이미지로 변환하는 방법에 대해 혼란스러워합니다.
어떤 아이디어? 감사.
업데이트:
이미지를 그레이 스케일로 수동으로 변환했습니다.
for row in range(0,newFrameImage.height):
for col in range(0,newFrameImage.width):
newFrameImageGS[row,col] = (newFrameImage8U[row,col][0] * 0.114 + # B
newFrameImage8U[row,col][1] * 0.587 + # G
newFrameImage8U[row,col][2] * 0.299) # R
그러나 이것은 꽤 오랜 시간이 걸립니다. 그리고 나는 여전히 cvcvtcolor가 프로그램이 충돌하는 이유를 알 수 없습니다.
해결책
어떤 이유로, cvtcolor는 이미지가 8 비트가 될 때 프로그램이 충돌시켰다. 32 비트로 변환하면 프로그램이 더 이상 충돌하지 않으며 모든 것이 잘 작동하는 것처럼 보였습니다. 나는 이것이 왜 그런지 모르겠지만 적어도 지금은 작동합니다.
newFrameImage = cv.QueryFrame(ps3eye)
newFrameImage32F = cv.CreateImage((320, 240), cv.IPL_DEPTH_32F, 3)
cv.ConvertScale(newFrameImage,newFrameImage32F)
newFrameImageGS_32F = cv.CreateImage ((320,240), cv.IPL_DEPTH_32F, 1)
cv.CvtColor(newFrameImage32F,newFrameImageGS_32F,cv.CV_RGB2GRAY)
newFrameImageGS = cv.CreateImage ((320,240), cv.IPL_DEPTH_8U, 1)
cv.ConvertScale(newFrameImageGS_32F,newFrameImageGS)
다른 팁
여기에는 일반적인 실수가 있습니다.
당신은에서 단일 이미지를 만들고 있습니다 newFrameImageGS
변하기 쉬운 ~ 전에 루프는 루프에 내용물을 덮어 쓰고 목록에 추가됩니다. 결과는 당신이 기대할 수있는 것이 아닙니다. 목록에는 끝에 동일한 이미지 인스턴스에 대한 5 개의 참조가 포함됩니다. 객체 참조 만 목록에 추가되므로 이런 식으로 만든 객체의 사본은 없습니다. 이 이미지에는 마지막 프레임이 포함되어 있으므로 결과적으로 5 개의 프레임을 얻을 수 있습니다. 확실하지 않은 경우 Python 튜토리얼을 검토하십시오. 위의 코드의 첫 번째 줄을 For Loop의 본문으로 이동하여이를 해결할 수 있습니다.
위의 것을 고치면 또 다른 가능성이 도움이되지 않습니다.
그만큼 CvtColor
기능은 다른 수의 채널로 변환 할 수 있기 때문에 그레이 스케일로 변환하기에 올바른 것으로 보입니다.
에 따르면 이 설명서 그만큼 CvtColor
함수에는 소스와 동일한 데이터 유형의 대상 이미지가 필요합니다. 두 번 확인하십시오 newFrameImage
a IPL_DEPTH_8U
영상.