私は客観的なC/C++とopenCVでプログラムを構築しています。私はObjective Cではかなり熟練していますが、C++では初めてです。
私はカスタムRGB2HSVアルゴリズムを構築しています。私のアルゴリズムはopenCVライブラリcvtColor(in、out、CV_RGB2HSV)と少し異なります。
フォームMatlabをopencV/C++に変換しようとすると、後で処理する前に追加のフィルタリングが不要なので、きれいなHSV画像が得られます。以下のコード - Matlabコードは自明です。高度なrgb2hsv変換Matlabからピクセル値へのopnecv/C++へのアクセス
私はそれをC++/openCV関数に変換しようとしていますが、画像のピクセル値にアクセスしようと壁に当たっています。私はC++を初めて使っています。 私はMat構造にアクセスする方法をたくさん読んでいましたが、通常、 "\ 202 k g"のような数字のいずれか、またはゼロの場所で文字の束を取得します。 \ 202という乗算演算をしようとすると、結果は数学とは関係ありません。
ピクセル値に正しくアクセスするのを手伝ってください。また、現在のバージョンでは、一部の値が0-255の範囲外にあるため、ucharを使用しても機能しません。 アルゴリズムは私のものではありません。私はソースを指摘することすらできませんが、在庫RGB2HSVよりも明らかに優れた結果を出します。
また、以下のアルゴリズムは1ピクセルです。イメージの各ピクセルに適用する必要があります。最終バージョンでは{for {}}ループでラップする必要があります。
また、この方法をコミュニティと共有して、誰もがそのメリットを得て、プリフィルタリングを保存することができます。
私はC++/openCVに翻訳してください。できるだけベストプラクティスでスピードを賢明にする。または少なくともピクセル値に明確にアクセスする方法は、数学的方程式の範囲で実行可能です。前もって感謝します。 3チャンネル、8ビット精度の画像の画素の値にアクセスするには
function[H, S, V] = rgb2hsvPixel(R,G,B)
% Algorithm:
% In case of 8-bit and 16-bit images, `R`, `G`, and `B` are converted to the
% floating-point format and scaled to fit the 0 to 1 range.
%
% V = max(R,G,B)
% S =/(V - min(R,G,B))/V if V != 0
% \ 0 otherwise
% /60*(G-B)/(V - min(R,G,B)) if V=R
% H = | 120 + 60*(B-R)/(V - min(R,G,B)) if V=G
% \ 240 + 60*(R-G)/(V - min(R,G,B)) if V=B
%
% If `H<0` then `H=H+360`. On output `0<=V<=1`, `0<=S<=1`, `0<=H<=360`.
red = (double(R)-16)*255/224; % \
green = (double(G)-16)*255/224; % }- R,G,B (0 <-> 255) -> (-18.2143 <-> 272.0759)
blue = (min(double(B)*2,240)-16)*255/224; %/
minV = min(red,min(green,blue));
value = max(red,max(green,blue));
delta = value - minV;
if(value~=0)
sat = (delta*255)/value;% s
if (delta ~= 0)
if(red == value)
hue = 60*(green - blue)/delta; % between yellow & magenta
elseif(green == value)
hue = 120 + 60*(blue - red)/delta; % between cyan & yellow
else
hue = 240 + 60*(red - green)/delta; % between magenta & cyan
end
if(hue < 0)
hue = hue + 360;
end
else
hue = 0;
sat = 0;
end
else
% r = g = b = 0
sat = 0;
hue = 0;
end
H = max(min(floor(((hue*255)/360)),255),0);
S = max(min(floor(sat),255),0);
V = max(min(floor(value),255),0);
end
あなたは正確に尋ねていますか? C++のMatオブジェクトの1ピクセルの値にアクセスするには?または、RGBをHSVに変換するための完全な作業コードが必要ですか? – Sunreef
少なくとも、ピクセルの実行可能な値に到達する方法。誰かがコミュニティに有益な機能を全面的に構築するのを助けることができれば。私は単純な数学的な論理でそれを構築することができますが、私はC++でもっとも効果的な方法ではないことを認識しています –