2017-02-18 4 views
3

OpenCV 3.2 버전을 사용하고 있습니다.OpenCV의 VideoCapture에서 가져온 이미지와 스칼라 간의 정수 구분

나는 기본 카메라 엽니 다

VideoCapture cap; 
cap.open(0); 

을 현재 프레임 잡아 :

Mat frame; 
cap.read(frame); 

가 지금은 그림과 색상 수를 줄이고 자합니다. 따라서, 나는 정수부을 수행하고 이미지에 같은 스칼라 값을 곱한다. 예를 들어 10이라고합시다. 이것은 C++ 연산자의 과부하로 쉽게 수행 할 수 있습니다.

Mat processedFrame = (frame/10) * 10 

그러나 frame 값은 부동 소수점 형식이다. 그런 다음 나누기는 정수 나누기로 수행되지 않으며 색상 감소가 이루어지지 않습니다.

정수 나누기를 수행하기 전에 frame의 캐스트를 정수 값으로 만들어서 고정시킬 수 있다고 생각합니다. 카메라가 1 (회색 스케일) 또는 3 (BGR) 컬러 채널로 이미지를 집어 넣을 수 있음을 고려하여이 캐스트를 어떻게 수행 할 수 있습니까?

+0

@Muscampester 예, 내가 시도'매트 processedFrame = (static_cast > (프레임)/10) * 10;'. 이것은 전체 검은 이미지를 반환합니다 ('frame' 값은 >> 10입니다). –

답변

2

OpenCV는 곱셈 및 나눗셈을위한 API도 제공합니다. 대신으로 오버로드 된 연산자를 사용하여 원하는 결과를 얻을 수 있도록하는 API를 사용할 수 있습니다

// Assuming the image to be RGB 
cv::divide(frame, cv::Scalar(10, 10, 10), frame, 1, CV_8UC3); 
cv::multiply(frame, cv::Scalar(10, 10, 10), frame, 1, CV_8UC3); 
+0

그것은 효과가있는 것처럼 보였지만,이 솔루션은 ** 반올림 ** ** ** ** (정수 나누기) 대신 부서를 실현했습니다. 값이 16 인 픽셀 (그레이 스케일이라고 가정)을 10으로 줄이면 값이 20 인 픽셀로 변환됩니다 (10 대신). –

+0

좋아,이 문제는 [여기] (http://stackoverflow.com/questions/30833540/is-there-a-way-to-prevent-rounding-in-opencv-matrix-divison)에서와 같이 수정할 수 있습니다. –