[OpenCV] MeanShift Clustering C++ Code

2020. 5. 13. 13:31· Programming/OpenCV
반응형

 

#include <iostream>
#include <vector>
#include <ctime>

#include "opencv342.h"

using namespace std;

cv::Mat MeanShift_Cluster(cv::Mat);

static void floodFillPostprocess(cv::Mat& img, const cv::Scalar& colorDiff = cv::Scalar::all(1)) {
  CV_Assert(!img.empty());
  cv::RNG rng = cv::theRNG();
  cv::Mat mask(img.rows + 2, img.cols + 2, CV_8UC1, cv::Scalar::all(0));

  /////////////////////////
  // 추가한 부분
  cv::Mat _mask = mask.clone(), diff = mask.clone();
  cv::Mat cpy = img.clone();
  float val1, val2, val3;
  int nPoints, iTemp, i, j;
  ////////////////////////

  for (int y = 0; y < img.rows; y++) {
    for (int x = 0; x < img.cols; x++) {
      if (mask.at<uchar>(y + 1, x + 1) == 0) {
        mask.copyTo(_mask); // 추가한 부분
        cv::Scalar newVal(rng(256), rng(256), rng(256));
        // img 대신 cpy 로 변경
        cv::floodFill(cpy, mask, cv::Point(x, y), newVal, 0, colorDiff, colorDiff);
        diff = mask - _mask; // 추가한 부분

        /////////////////////////////
        // 추가한 부분
        nPoints = 0;
        val1 = val2 = val3 = 0.0;
        for (i = 0; i < img.rows; i++) {
          for (j = 0; j < img.cols; j++) {
            if (diff.at<uchar>(i + 1, j + 1)) {
              val1 += img.at<cv::Vec3b>(i, j)[0];
              val2 += img.at<cv::Vec3b>(i, j)[1];
			  val3 += img.at<cv::Vec3b>(i, j)[2];
			  nPoints++;
			}
		  }
		}
		for (i = 0; i < img.rows; i++) {
		  for (j = 0; j < img.cols; j++) {
			if (diff.at<uchar>(i + 1, j + 1)) {
			  iTemp = cvRound(val1 / (float)nPoints);
			  iTemp = iTemp > 255 ? 255 : iTemp < 0 ? 0 : iTemp;
			  img.at<cv::Vec3b>(i, j)[0] = (uchar)iTemp;

			  iTemp = cvRound(val2 / (float)nPoints);
			  iTemp = iTemp > 255 ? 255 : iTemp < 0 ? 0 : iTemp;
			  img.at<cv::Vec3b>(i, j)[1] = (uchar)iTemp;

			  iTemp = cvRound(val3 / (float)nPoints);
			  iTemp = iTemp > 255 ? 255 : iTemp < 0 ? 0 : iTemp;
			  img.at<cv::Vec3b>(i, j)[2] = (uchar)iTemp;
			}
		  }
		}
	  }
	}
  }
}

int main() {
  string CLUSTER[5] = { "12003.jpg", "25098.jpg", "97017.jpg", "151087.jpg", "181018.jpg" };
  string path = "testImage/";

  // Mean Shift Clustering
  cout << "Start MeanShift Clustering." << endl;
  for (int i = 0; i < 5; i++) {
    cv::Mat img = cv::imread(path + CLUSTER[i]);
    cv::Mat result;
    result = MeanShift_Cluster(img);
    cv::imwrite(path + "Result_MeanShift/" + CLUSTER[i], result);
  }
  cout << "End MeanShift Clustering." << endl;
}

cv::Mat MeanShift_Cluster(cv::Mat src) {
  cv::Mat result;

  double sp, sr;

  sp = 10; // the spatial window radius
  sr = 10; // the color window radius
  cv::pyrMeanShiftFiltering(src, result, sp, sr);
  floodFillPostprocess(result, cv::Scalar::all(2));

  return result;
}
반응형

'Programming > OpenCV' 카테고리의 다른 글

[OpenCV] QuadTree Clustering C++ Code  (0) 2019.11.25
[OpenCV] KMeans Clustering C++ Code  (0) 2019.11.25
[OpenCV] Otsu's Algorithm 이론 설명 및 C++ Code  (0) 2019.04.05
'Programming/OpenCV' 카테고리의 다른 글
  • [OpenCV] QuadTree Clustering C++ Code
  • [OpenCV] KMeans Clustering C++ Code
  • [OpenCV] Otsu's Algorithm 이론 설명 및 C++ Code
오뚜깅
오뚜깅
오뚜깅
오뚜깅
오뚜깅
전체
오늘
어제
  • 분류 전체보기
    • 취업인생
    • Programming
      • C & C++
      • Python
      • OpenCV
      • PCL
      • ROS
      • Deep learning
      • Network
    • 알고리즘
      • 이론
      • 백준(BOJ)
      • 프로그래머스(Programmers)
    • Project
    • IT
      • 우분투
    • 일상
      • 말씀 묵상
      • 끄적임
      • 영어 일기

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c++code
  • CUDA
  • 백준2798
  • cudaversion
  • PointCloudLibrary
  • 사용자지정정규화공식
  • graphicdriver
  • 백준2231
  • installcuda
  • 우분투
  • kmeansclustering
  • 2292
  • imageclustering
  • pytorch
  • opencv
  • 오츠알고리즘
  • OtsuAlgorithm
  • DeepLearning
  • cuda설치
  • C++
  • installubuntu
  • 딥러닝환경구축
  • pointcloud
  • cuda9.0
  • cv_bridge
  • rospy
  • installcudnn
  • tensorflowversion
  • CuDNN
  • clustering

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
오뚜깅
[OpenCV] MeanShift Clustering C++ Code
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.