我試圖在使用OpenCV的視頻流中閾值紅色像素。我有其他顏色工作相當好,但紅色帶來了問題,因爲它圍繞着色相軸(即HSV(0,255,255)和HSV(179,255,255)都是紅色)。我現在使用的技術並不理想。基本上是:在OpenCV中使用HSV有效地使用HSV閾值
cvInRangeS(src, cvScalar(0, 135, 135), cvScalar(20, 255, 255), dstA);
cvInRangeS(src, cvScalar(159, 135, 135), cvScalar(179, 255, 255), dstB);
cvOr(dstA, dstB, dst);
這是最理想的,因爲它比簡單的情況下藍的時候需要紅色代碼分支(潛在的bug)的兩個額外的圖像的分配,以及兩個額外的操作:
cvInRangeS(src, cvScalar(100, 135, 135), cvScalar(140, 255, 255), dst);
對我來說,更好的選擇是「旋轉」圖像的顏色,使目標色調爲90度。例如。
int rotation = 90 - 179; // 179 = red
cvAddS(src, cvScalar(rotation, 0, 0), dst1);
cvInRangeS(dst1, cvScalar(70, 135, 135), cvScalar(110, 255, 255), dst);
這使我能夠對待所有顏色。
但是,cvAddS
操作在色階值低於0時不會將色調值迴繞到180,因此會丟失數據。我看着將圖像轉換爲CvMat
,以便我可以從中減去,然後使用模數將負值回到範圍的頂部,但CvMat
似乎不支持模數。當然,我可以迭代每個像素,但是我擔心這會很慢。
我讀過許多教程和代碼示例,但他們似乎都方便只看不周圍的色調譜換行甚至醜陋的(範圍,或使用的解決方案如:重新實現通過迭代每個像素並對彩色表進行手動比較)。
那麼,通常解決這個問題的方法是什麼?最好的方法是什麼?什麼是每個的權衡?迭代像素比使用內置CV函數慢得多?
交換紅色和綠色通道,閾值綠色和交換回? – MSalters