2017-02-18 15 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)のように修正できます。 –