opencvでHSVの平均値を出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takezawaakiragm
記事: 26
登録日時: 8年前

opencvでHSVの平均値を出力

#1

投稿記事 by takezawaakiragm » 8年前

opencvとvs2013を使い、画像をHSVに変換し、HSVのそれぞれの平均値を求めその値をexcelに出力するコードを実装しております。
以下のようなコードになったのですが、なぜか平均値がすべて同じ値になってしまいます。
正常にアクセスできていないか又は、計算ができていません。
どの部分が妨げているのでしょうか。
ご教授お願いします。

コード:

#include<iostream>
#include<opencv/cv.h>
#include<opencv/highgui.h>
#include<opencv2/opencv.hpp>
#include<fstream>
#include<stdio.h>
using namespace std;
using namespace cv;

IplImage *imgS1, *imgS2, *imgS3, *imgS4, *imgW1, *imgW2, *imgW3, *imgW4;
int main(int argc, char **argv)
{   //画像の読み込む(カラー)
	imgS1 = cvLoadImage(("1.bmp"), CV_LOAD_IMAGE_COLOR); imgW1 = cvLoadImage(("W1.bmp"), CV_LOAD_IMAGE_COLOR);
	imgS2 = cvLoadImage(("S2.bmp"), CV_LOAD_IMAGE_COLOR); imgW2 = cvLoadImage(("W2.bmp"), CV_LOAD_IMAGE_COLOR);
	imgS3 = cvLoadImage(("S3.bmp"), CV_LOAD_IMAGE_COLOR); imgW3 = cvLoadImage(("W3.bmp"), CV_LOAD_IMAGE_COLOR);
	imgS4 = cvLoadImage(("S4.bmp"), CV_LOAD_IMAGE_COLOR); imgW4 = cvLoadImage(("W4.bmp"), CV_LOAD_IMAGE_COLOR);
	// HSVを格納するオブジェクトの作成
	IplImage* hsvS1 = cvCreateImage(cvGetSize(imgS1), IPL_DEPTH_8U, 3), * hsvW1 = cvCreateImage(cvGetSize(imgW1), IPL_DEPTH_8U, 3),
			* hsvS2 = cvCreateImage(cvGetSize(imgS2), IPL_DEPTH_8U, 3), * hsvW2 = cvCreateImage(cvGetSize(imgW2), IPL_DEPTH_8U, 3),
			* hsvS3 = cvCreateImage(cvGetSize(imgS3), IPL_DEPTH_8U, 3), * hsvW3 = cvCreateImage(cvGetSize(imgW3), IPL_DEPTH_8U, 3),
			* hsvS4 = cvCreateImage(cvGetSize(imgS4), IPL_DEPTH_8U, 3), * hsvW4 = cvCreateImage(cvGetSize(imgW4), IPL_DEPTH_8U, 3);
	FILE	 *fpAllH;
	errno_t error;
	//総数
	int countS1 = 0, countS2 = 0, countS3 = 0, countS4 = 0, countW1 = 0, countW2 = 0, countW3 = 0, countW4 = 0;

	uchar qS1[3], qS2[3], qS3[3], qS4[3], qW1[3], qW2[3], qW3[3], qW4[3];
	//平均
	float hS1[3], hS2[3], hS3[3], hS4[3], hW1[3], hW2[3], hW3[3], hW4[3];
	//初期化
	hS1[0] = 0; hS1[1] = 0; hS1[2] = 0;		hW1[0] = 0; hW1[1] = 0; hW1[2] = 0;
	hS2[0] = 0; hS2[1] = 0; hS2[2] = 0;		hW2[0] = 0; hW2[1] = 0; hW2[2] = 0;
	hS3[0] = 0; hS3[1] = 0; hS3[2] = 0;		hW3[0] = 0; hW3[1] = 0; hW3[2] = 0;
	hS4[0] = 0; hS4[1] = 0; hS4[2] = 0;		hW4[0] = 0; hW4[1] = 0; hW4[2] = 0;
	//ファイルOPEN
	if ((error = fopen_s(&fpAllH, "AllH.csv", "w"))){
		return 0;
	}
	//S1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvS1->height; y++) {
		for (int x = 0; x < hsvS1->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvS1->height && x < hsvS1->width){
				qS1[0] = hsvS1->imageData[hsvS1->widthStep * y + x * 3];        // H
				qS1[1] = hsvS1->imageData[hsvS1->widthStep * y + x * 3 + 1];    // S
				qS1[2] = hsvS1->imageData[hsvS1->widthStep * y + x * 3 + 2];    // V
			
				//HSVそれぞれ平均を求める
				hS1[0] = hS1[0] + (float)qS1[0];
				hS1[1] = hS1[1] + (float)qS1[1];
				hS1[2] = hS1[2] + (float)qS1[2];

				countS1++;
				//出力
				printf("H:S:V"); printf("(%d,", qS1[0]); printf("%d,", qS1[1]); printf("%d)\n", qS1[2]);

				
			}
		}
	}
	//excelに平均を出力
	hS1[0] = hS1[0] / countS1;
	hS1[1] = hS1[1] / countS1;
	hS1[2] = hS1[2] / countS1;

	fprintf(fpAllH, "%d,%d,%d \n", (uchar)hS1[0], (uchar)hS1[1], (uchar)hS1[2]);


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	//平均の出力
	printf("hS1[H]の平均:%f ", hS1[0]); printf("hS1[S]の平均:%f ", hS1[1]); printf("hS1[V]の平均:%f\n", hS1[2]);
	printf("hS2[H]の平均:%f ", hS2[0]); printf("hS2[S]の平均:%f ", hS2[1]); printf("hS2[V]の平均:%f\n", hS2[2]);
	printf("hS3[H]の平均:%f ", hS3[0]); printf("hS3[S]の平均:%f ", hS3[1]); printf("hS3[V]の平均:%f\n", hS3[2]);
	printf("hS4[H]の平均:%f ", hS4[0]); printf("hS4[S]の平均:%f ", hS4[1]); printf("hS4[V]の平均:%f\n", hS4[2]);
	printf("hW1[H]の平均:%f ", hW1[0]); printf("hW1[S]の平均:%f ", hW1[1]); printf("hW1[V]の平均:%f\n", hW1[2]);
	printf("hW2[H]の平均:%f ", hW2[0]); printf("hW2[S]の平均:%f ", hW2[1]); printf("hW2[V]の平均:%f\n", hW2[2]);
	printf("hW3[H]の平均:%f ", hW3[0]); printf("hW3[S]の平均:%f ", hW3[1]); printf("hW3[V]の平均:%f\n", hW3[2]);
	printf("hW4[H]の平均:%f ", hW4[0]); printf("hW4[S]の平均:%f ", hW4[1]); printf("hW4[V]の平均:%f\n", hW4[2]);
	//総数の出力
	printf("S1の総数:%d\n", countS1);
	printf("S2の総数:%d\n", countS2);
	printf("S3の総数:%d\n", countS3);
	printf("S4の総数:%d\n", countS4);
	printf("W1の総数:%d\n", countW1);
	printf("W2の総数:%d\n", countW2);
	printf("W3の総数:%d\n", countW3);
	printf("W4の総数:%d\n", countW4);
	//ファイルを閉じる
	fclose(fpAllH);
	cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
	cvShowImage("Image", hsvS1);
	cvWaitKey(0);
	cvDestroyWindow("Image");
	cvReleaseImage(&hsvS1), cvReleaseImage(&hsvS2), cvReleaseImage(&hsvS3), cvReleaseImage(&hsvS4),
		cvReleaseImage(&hsvW1), cvReleaseImage(&hsvW2), cvReleaseImage(&hsvW3), cvReleaseImage(&hsvW4);

	return 0;
}

metaphor

Re: opencvでHSVの平均値を出力

#2

投稿記事 by metaphor » 8年前

S1しか計算してないからではありません。

コード:

hS1[H]の平均:204.333008 hS1[S]の平均:204.333008 hS1[V]の平均:204.333008
hS2[H]の平均:0.000000 hS2[S]の平均:0.000000 hS2[V]の平均:0.000000
hS3[H]の平均:0.000000 hS3[S]の平均:0.000000 hS3[V]の平均:0.000000
hS4[H]の平均:0.000000 hS4[S]の平均:0.000000 hS4[V]の平均:0.000000
hW1[H]の平均:0.000000 hW1[S]の平均:0.000000 hW1[V]の平均:0.000000
hW2[H]の平均:0.000000 hW2[S]の平均:0.000000 hW2[V]の平均:0.000000
hW3[H]の平均:0.000000 hW3[S]の平均:0.000000 hW3[V]の平均:0.000000
hW4[H]の平均:0.000000 hW4[S]の平均:0.000000 hW4[V]の平均:0.000000
S1の総数:245760
S2の総数:0
S3の総数:0
S4の総数:0
W1の総数:0
W2の総数:0
W3の総数:0
W4の総数:0

metaphor

Re: opencvでHSVの平均値を出力

#3

投稿記事 by metaphor » 8年前

違うことで平均値が同じといういみですか。

metaphor

Re: opencvでHSVの平均値を出力

#4

投稿記事 by metaphor » 8年前

何故かこの値が
H:S:V(205,205,205)
H:S:V(205,205,205)
H:S:V(205,205,205)
...
のように一定になるようですが?。

コード:

				countS1++;
				//出力
				printf("H:S:V"); printf("(%d,", qS1[0]); printf("%d,", qS1[1]); printf("%d)\n", qS1[2]);

metaphor

Re: opencvでHSVの平均値を出力

#5

投稿記事 by metaphor » 8年前

ループの所をデバッガーでみてもHSVが一定で(OpenCVのmat.hppの中へ入るので)門外漢の私には分かりません。

metaphor

Re: opencvでHSVの平均値を出力

#6

投稿記事 by metaphor » 8年前

画像をチェックした所HSV化されていませんでした。(白い画面)

コード:

	cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
	cvShowImage("Image", imgS1);
	cvWaitKey(0);
	cvDestroyWindow("Image");
	// HSVを格納するオブジェクトの作成
	IplImage* hsvS1 = cvCreateImage(cvGetSize(imgS1), IPL_DEPTH_8U, 3), *hsvW1 = cvCreateImage(cvGetSize(imgW1), IPL_DEPTH_8U, 3),
		*hsvS2 = cvCreateImage(cvGetSize(imgS2), IPL_DEPTH_8U, 3), *hsvW2 = cvCreateImage(cvGetSize(imgW2), IPL_DEPTH_8U, 3),
		*hsvS3 = cvCreateImage(cvGetSize(imgS3), IPL_DEPTH_8U, 3), *hsvW3 = cvCreateImage(cvGetSize(imgW3), IPL_DEPTH_8U, 3),
		*hsvS4 = cvCreateImage(cvGetSize(imgS4), IPL_DEPTH_8U, 3), *hsvW4 = cvCreateImage(cvGetSize(imgW4), IPL_DEPTH_8U, 3);
	cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
	cvShowImage("Image", hsvS1);
	cvWaitKey(0);
	cvDestroyWindow("Image");
	FILE     *fpAllH;
	errno_t error;

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: opencvでHSVの平均値を出力

#7

投稿記事 by みけCAT » 8年前

opencv(原文ママ)は詳しくないですが、「HSVを格納するオブジェクトの作成」をしただけで実際にHSVを格納する作業をしていないように見えます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

metaphor

Re: opencvでHSVの平均値を出力

#8

投稿記事 by metaphor » 8年前

そうでした。(そういえば”画像をHSVに変換し”してるに"だまされた”。)

閉鎖

“C言語何でも質問掲示板” へ戻る