動画内のある輝点を指定して、RGBで強度を出しています。その際2つの点の相関関係を出しています。
下図に示した相関関係をk-meansでクラスタリングしたいです。
sk-learn.clusterをインストールしていろいろ試しましたがうまくいかないです。
python
1# -*- coding: utf-8 -*- 2import cv2 3import matplotlib.pyplot as plt 4from numpy import * 5import pandas as pd 6from scipy import signal 7from sklearn.cluster import KMeans 8 9video_path = "water50_2.mkv" 10cap = cv2.VideoCapture(video_path) 11 12count = cap.get(cv2.CAP_PROP_FRAME_COUNT) 13fps = cap.get(cv2.CAP_PROP_FPS) 14 15numS=raw_input("start frame: ") 16numS=int(numS) 17 18numE=raw_input("end frame: ") 19numE=int(numE) 20#numE=count 21print(numE) 22 23# 場所を決める 24#点滅の場所 25x1min=raw_input("点滅1左上のx座標:") 26y1min=raw_input("点滅1左上のy座標:") 27x1max=raw_input("点滅1右下のx座標:") 28y1max=raw_input("点滅1右下のy座標:") 29 30X1min=int(x1min) 31Y1min=int(y1min) 32X1max=int(x1max) 33Y1max=int(y1max) 34 35 36 37#ノイズの場所 38xnoisemin=raw_input("左上ノイズx座標:") 39ynoisemin=raw_input("左上ノイズy座標:") 40xnoisemax=raw_input("右下ノイズx座標:") 41ynoisemax=raw_input("右下ノイズy座標:") 42 43Xnoisemin=int(xnoisemin) 44Ynoisemin=int(ynoisemin) 45Xnoisemax=int(xnoisemax) 46Ynoisemax=int(ynoisemax) 47 48# フレーム [numS,numE] の範囲で各フレームの [ymin, ymax]x[xmin, xmax] の画素の平均を計算する。 49frame_no = arange(numS,numE) 50intensity1 = [] 51intensity2=[] 52intensity3=[] 53intensitynoise=[] 54for i in frame_no: 55 # フレーム frame_no を取得する。 56 cap.set(cv2.CAP_PROP_POS_FRAMES, i) 57 ret, frame = cap.read() 58 if not ret: 59 print('Failed to grab frame.') 60 break 61 # 平均画素値を計算する。 62 intensity1.append(frame[Y1min:Y1max+1, X1min:X1max+1].mean()) 63 intensitynoise.append(frame[Ynoisemin:Ynoisemax+1, Xnoisemin:Xnoisemax+1].mean()) 64 print "frame number ",i 65 66plt.plot(intensity1,intensitynoise,'x') 67corr=corrcoef(intensity1,intensitynoise) 68a=corr[0,1] 69print(a) 70pred=KMeans(n_clusters=3).fit(a) 71plt.xlabel("left intensity") 72plt.ylabel("right intensity") 73plt.title("Correlation coefficient:%s"%a) 74plt.show()
例えば以上のコードで実行すると以下のエラーメッセージが出てきます
Traceback (most recent call last):
File "散布図と相関係数.py", line 90, in <module>
pred=KMeans(n_clusters=3).fit(a)
File "/usr/lib/python2.7/dist-packages/sklearn/cluster/k_means_.py", line 887, in fit
X = self.check_fit_data(X)
File "/usr/lib/python2.7/dist-packages/sklearn/cluster/k_means.py", line 861, in _check_fit_data
X.shape[0], self.n_clusters))
ValueError: n_samples=1 should be >= n_clusters=3
(program exited with code: 1)
Press return to continue