イメージからすべてのオブジェクトを取得する方法イメージオブジェクトを色で分けています。 次の画像には約20色あります。私はすべての色とその位置をベクトル(Vec3bとRect)で抽出したいと思います。Opencv:分割されたカラフルな画像からすべてのオブジェクトを取得
私は私がオブジェクトの位置を区別することができます ように、私は、各色の位置を取得したいセグメンテーション
セグメント化された画像
Mat src, dst;
String imageName("/home/pathToImage.jpg");
src = imread(imageName,1);
if(src.rows < 1)
return -1;
for(int i=0; i<src.rows; i=i+5)
{ for(int j=0; j<src.cols; j=j+5)
{
Vec3b color = src.at<Vec3b>(Point(i,j));
if(colors.empty())
{
colors.push_back(color);
}
else{
bool add = true;
for(int k=0; k<colors.size(); k++)
{
int rmin = colors[k].val[0]-5,
rmax = colors[k].val[0]+5,
gmin = colors[k].val[1]-5,
gmax = colors[k].val[1]+5,
bmin = colors[k].val[2]-5,
bmax = colors[k].val[2]+5;
if((
(color.val[0] >= rmin && color.val[0] <= rmax) &&
(color.val[1] >= gmin && color.val[1] <= gmax) &&
(color.val[2] >= bmin && color.val[2] <= bmax))
)
{
add = false;
break;
}
}
if(add)
colors.push_back(color);
}
}
}
int size = colors.size();
for(int i=0; i<colors.size();i++)
{
Mat inrangeImage;
//cv::inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
cv::inRange(src, cv::Scalar(colors[i].val[0]-1, colors[i].val[1]-1, colors[i].val[2]-1), cv::Scalar(colors[i].val[0]+1, colors[i].val[1]+1, colors[i].val[2]+1), inrangeImage);
imwrite("/home/kavtech/Segmentation/1/opencv-wrapper-egbis/images/inrangeImage.jpg",inrangeImage);
}
/// Display
namedWindow("Image", WINDOW_AUTOSIZE);
imshow("Image", src);
waitKey(0);
ためegbis algorithumを使用しています。助けてください!
入力画像と期待される出力結果も提供してください。入力画像を色分けするためのカスタムアルゴリズムを書く必要はありません。Opencvには、同じ処理を行う 'kmeans'のような機能が組み込まれています。 – ZdaR
@ZdaR今すぐご覧ください –
私はhttps://github.com/christofferholmstedt/opencv-wrapper-egbis –