opencvによるHSVの変更

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

opencvによるHSVの変更

#1

投稿記事 by takezawaakiragm » 8年前

現在、欠損している画像をテクスチゃ合成で補間しようとしております。
そこで、結合する画像を捜し、切り取ることはできたのですが、そのまま結合するとHSVが異なるため、欠損領域周辺のHSVに近づけたいと思っております。
HSV値を[キャプチャ.png]のようにHSVを変えました。
しかし、なぜかHSVがうまく変わっていません。
Q1=Q1*b1/a1とするべきなのでしょうか。
どなたかご教授お願いします。

コード:

#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(("S1.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);
	// BGR -> HSV 変換
	cvCvtColor(imgS1, hsvS1, CV_BGR2HSV),cvCvtColor(imgW1, hsvW1, CV_BGR2HSV);
	cvCvtColor(imgS2, hsvS2, CV_BGR2HSV), cvCvtColor(imgW2, hsvW2, CV_BGR2HSV);
	cvCvtColor(imgS3, hsvS3, CV_BGR2HSV), cvCvtColor(imgW3, hsvW3, CV_BGR2HSV);
	cvCvtColor(imgS4, hsvS4, CV_BGR2HSV), cvCvtColor(imgW4, hsvW4, CV_BGR2HSV);
	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", hS1[0],hS1[1], hS1[2]);


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//S2///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvS2->height; y++) {
		for (int x = 0; x < hsvS2->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvS2->height && x < hsvS2->width){
				qS2[0] = hsvS2->imageData[hsvS2->widthStep * y + x * 3];        // H
				qS2[1] = hsvS2->imageData[hsvS2->widthStep * y + x * 3 + 1];    // S
				qS2[2] = hsvS2->imageData[hsvS2->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hS2[0] = hS2[0] + (float)qS2[0];
				hS2[1] = hS2[1] + (float)qS2[1];
				hS2[2] = hS2[2] + (float)qS2[2];

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


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

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


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//S3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvS3->height; y++) {
		for (int x = 0; x < hsvS3->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvS3->height && x < hsvS3->width){
				qS3[0] = hsvS3->imageData[hsvS3->widthStep * y + x * 3];        // H
				qS3[1] = hsvS3->imageData[hsvS3->widthStep * y + x * 3 + 1];    // S
				qS3[2] = hsvS3->imageData[hsvS3->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hS3[0] = hS3[0] + (float)qS3[0];
				hS3[1] = hS3[1] + (float)qS3[1];
				hS3[2] = hS3[2] + (float)qS3[2];

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


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

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


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//S4///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvS4->height; y++) {
		for (int x = 0; x < hsvS4->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvS4->height && x < hsvS4->width){
				qS4[0] = hsvS4->imageData[hsvS4->widthStep * y + x * 3];        // H
				qS4[1] = hsvS4->imageData[hsvS4->widthStep * y + x * 3 + 1];    // S
				qS4[2] = hsvS4->imageData[hsvS4->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hS4[0] = hS4[0] + (float)qS4[0];
				hS4[1] = hS4[1] + (float)qS4[1];
				hS4[2] = hS4[2] + (float)qS4[2];

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


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

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


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//W1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvW1->height; y++) {
		for (int x = 0; x < hsvW1->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvW1->height && x < hsvW1->width){
				qW1[0] = hsvW1->imageData[hsvW1->widthStep * y + x * 3];        // H
				qW1[1] = hsvW1->imageData[hsvW1->widthStep * y + x * 3 + 1];    // S
				qW1[2] = hsvW1->imageData[hsvW1->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hW1[0] = hW1[0] + (float)qW1[0];
				hW1[1] = hW1[1] + (float)qW1[1];
				hW1[2] = hW1[2] + (float)qW1[2];

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


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

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


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//W2///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvW2->height; y++) {
		for (int x = 0; x < hsvW2->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvW2->height && x < hsvW2->width){
				qW2[0] = hsvW2->imageData[hsvW2->widthStep * y + x * 3];        // H
				qW2[1] = hsvW2->imageData[hsvW2->widthStep * y + x * 3 + 1];    // S
				qW2[2] = hsvW2->imageData[hsvW2->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hW2[0] = hW2[0] + (float)qW2[0];
				hW2[1] = hW2[1] + (float)qW2[1];
				hW2[2] = hW2[2] + (float)qW2[2];

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


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

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


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//W3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvW3->height; y++) {
		for (int x = 0; x < hsvW3->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvW3->height && x < hsvW3->width){
				qW3[0] = hsvW3->imageData[hsvW3->widthStep * y + x * 3];        // H
				qW3[1] = hsvW3->imageData[hsvW3->widthStep * y + x * 3 + 1];    // S
				qW3[2] = hsvW3->imageData[hsvW3->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hW3[0] = hW3[0] + (float)qW3[0];
				hW3[1] = hW3[1] + (float)qW3[1];
				hW3[2] = hW3[2] + (float)qW3[2];

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


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

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


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//W4///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	for (int y = 0; y < hsvW4->height; y++) {
		for (int x = 0; x < hsvW4->width; x++) {
			// HSVの取得
			if (0 <= y && 0 <= x && y < hsvW4->height && x < hsvW4->width){
				qW4[0] = hsvW4->imageData[hsvW4->widthStep * y + x * 3];        // H
				qW4[1] = hsvW4->imageData[hsvW4->widthStep * y + x * 3 + 1];    // S
				qW4[2] = hsvW4->imageData[hsvW4->widthStep * y + x * 3 + 2];    // V

				//HSVそれぞれ平均を求める
				hW4[0] = hW4[0] + (float)qW4[0];
				hW4[1] = hW4[1] + (float)qW4[1];
				hW4[2] = hW4[2] + (float)qW4[2];

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


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

	fprintf(fpAllH, "%d,%d,%d \n",hW4[0],hW4[1],hW4[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]);
	//QにかけるHSV値
	double xHQ1 = 0, xSQ1 = 0, xVQ1 = 0,
		xHQ2 = 0, xSQ2 = 0, xVQ2 = 0,
		xHQ3 = 0, xSQ3 = 0, xVQ3 = 0,
		xHQ4 = 0, xSQ4 = 0, xVQ4 = 0;
		//Q1 の H							  S                  V
		xHQ1 = hS1[0] / hW1[0];  xSQ1 = hS1[1] / hW1[1];   xVQ1 = hS1[2] / hW1[2];
		//Q2 の H							  S                  V
		xHQ2 = hS2[0] / hW2[0];  xSQ2 = hS2[1] / hW2[1];   xVQ2 = hS2[2] / hW2[2];
		//Q3 の H							  S                  V
		xHQ3 = hS3[0] / hW3[0];  xSQ3 = hS3[1] / hW3[1];   xVQ3 = hS3[2] / hW3[2];
		//Q4 の H							  S                  V
		xHQ4 = hS4[0] / hW4[0];  xSQ4 = hS4[1] / hW4[1];   xVQ4 = hS4[2] / hW4[2];

		printf("Q1にかけるH値%flS値%fV値%f", xHQ1, xSQ1, xVQ1);
		printf("Q2にかけるH値%flS値%fV値%f", xHQ2, xSQ2, xVQ2);
		printf("Q3にかけるH値%flS値%fV値%f", xHQ3, xSQ3, xVQ3);
		printf("Q4にかけるH値%flS値%fV値%f", xHQ4, xSQ4, xVQ4);
		//総数の出力
	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);

	/////・・・Change Of HSV/////////////////////////////////////////////////////
	//変えるH(色相) S(彩度)
	double  HQ1 = xHQ1, HQ2 = xHQ2, HQ3 = xHQ3, HQ4 = xHQ4;
	double	SQ1 = xSQ1, SQ2 = xSQ2, SQ3 = xSQ3, SQ4 = xSQ4;
	double  VQ1 = xVQ1, VQ2 = xVQ2, VQ3 = xVQ3, VQ4 = xVQ4;

	//
	Mat hsv_Q1, HSVQ1, BGRQ1, hsv_Q4, HSVQ4, BGRQ4,
		hsv_Q2, HSVQ2, BGRQ2, hsv_Q3, HSVQ3, BGRQ3;
	Mat pQ1[3], qQ1[3], pQ2[3], qQ2[3], pQ3[3], qQ3[3], pQ4[3], qQ4[3];
	Mat Q1tmpQ1[3], Q2tmpQ2[3], Q3tmpQ3[3], Q4tmpQ4[3];
	//画像の読み込み
	Mat imgQ1 = imread("Q1.bmp"), imgQ2 = imread("Q2.bmp"),
		imgQ3 = imread("Q3.bmp"), imgQ4 = imread("Q4.bmp");
	//HSVに変換
	cvtColor(imgQ1, hsv_Q1, CV_BGR2HSV), cvtColor(imgQ2, hsv_Q2, CV_BGR2HSV),
		cvtColor(imgQ3, hsv_Q3, CV_BGR2HSV), cvtColor(imgQ4, hsv_Q4, CV_BGR2HSV);
	//Q1////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q1, pQ1);
	//Matの型変換(少数の積を正確にするため)
	pQ1[0].convertTo(Q1tmpQ1[0], CV_32F);
	pQ1[1].convertTo(Q1tmpQ1[1], CV_32F);
	pQ1[2].convertTo(Q1tmpQ1[2], CV_32F);
	//HSVの値を変更
	qQ1[0] = pQ1[0] * SQ1;
	qQ1[1] = pQ1[1] * HQ1;
	qQ1[2] = pQ1[2] * VQ1;
	merge(qQ1, 3, HSVQ1);
	//BGRに変換
	cvtColor(HSVQ1, BGRQ1, CV_HSV2BGR);
	namedWindow("Q1");
	imshow("Q1", BGRQ1);
	////////////////////////////////////////////////////////////////////////////////
	//Q2////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q2, pQ2);
	//Matの型変換(少数の積を正確にするため)
	pQ2[0].convertTo(Q2tmpQ2[0], CV_32F);
	pQ2[1].convertTo(Q2tmpQ2[1], CV_32F);
	pQ2[2].convertTo(Q2tmpQ2[2], CV_32F);
	//HSVの値を変更
	qQ2[0] = pQ2[0] * SQ2;
	qQ2[1] = pQ2[1] * HQ2;
	qQ2[2] = pQ2[2] * VQ2;
	merge(qQ2, 3, HSVQ2);
	//BGRに変換
	cvtColor(HSVQ2, BGRQ2, CV_HSV2BGR);
	namedWindow("Q2");
	imshow("Q2", BGRQ2);
	////////////////////////////////////////////////////////////////////////////////
	//Q3////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q3, pQ3);
	//Matの型変換(少数の積を正確にするため)
	pQ3[0].convertTo(Q3tmpQ3[0], CV_32F);
	pQ3[1].convertTo(Q3tmpQ3[1], CV_32F);
	pQ3[2].convertTo(Q3tmpQ3[2], CV_32F);
	//HSVの値を変更
	qQ3[0] = pQ3[0] * SQ3;
	qQ3[1] = pQ3[1] * HQ3;
	qQ3[2] = pQ3[2] * VQ3;
	merge(qQ3, 3, HSVQ3);
	//BGRに変換
	cvtColor(HSVQ3, BGRQ3, CV_HSV2BGR);
	namedWindow("Q3");
	imshow("Q3", BGRQ3);
	////////////////////////////////////////////////////////////////////////////////
	//Q4////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q4, pQ4);
	//Matの型変換(少数の積を正確にするため)
	pQ4[0].convertTo(Q4tmpQ4[0], CV_32F);
	pQ4[1].convertTo(Q4tmpQ4[1], CV_32F);
	pQ4[2].convertTo(Q4tmpQ4[2], CV_32F);
	//HSVの値を変更
	qQ4[0] = pQ4[0] * SQ4;
	qQ4[1] = pQ4[1] * HQ4;
	qQ4[2] = pQ4[2] * VQ4;
	merge(qQ4, 3, HSVQ4);
	//BGRに変換
	cvtColor(HSVQ4, BGRQ4, CV_HSV2BGR);
	namedWindow("Q4");
	imshow("Q4", BGRQ4);
	////////////////////////////////////////////////////////////////////////////////
	//ファイルを閉じる
	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);
	// 画像を保存する
	cv::imwrite("HSVQ1.bmp", BGRQ1);
	cv::imwrite("HSVQ2.bmp", BGRQ2);
	cv::imwrite("HSVQ3.bmp", BGRQ3);
	cv::imwrite("HSVQ4.bmp", BGRQ4);
	destroyAllWindows();
	/////
	return 0;
}

添付ファイル
キャプチャ.PNG

と成りのトトロ

Re: opencvによるHSVの変更

#2

投稿記事 by と成りのトトロ » 8年前

この辺りの定義が8割がた間違っているために

コード:

	//
	Mat hsv_Q1, HSVQ1, BGRQ1, hsv_Q4, HSVQ4, BGRQ4,
		hsv_Q2, HSVQ2, BGRQ2, hsv_Q3, HSVQ3, BGRQ3;
	Mat pQ1[3], qQ1[3], pQ2[3], qQ2[3], pQ3[3], qQ3[3], pQ4[3], qQ4[3];
	Mat Q1tmpQ1[3], Q2tmpQ2[3], Q3tmpQ3[3], Q4tmpQ4[3];
	//画像の読み込み
	Mat imgQ1 = imread("Q1.bmp"), imgQ2 = imread("Q2.bmp"),
		imgQ3 = imread("Q3.bmp"), imgQ4 = imread("Q4.bmp");
	//HSVに変換
	cvtColor(imgQ1, hsv_Q1, CV_BGR2HSV), cvtColor(imgQ2, hsv_Q2, CV_BGR2HSV),
		cvtColor(imgQ3, hsv_Q3, CV_BGR2HSV), cvtColor(imgQ4, hsv_Q4, CV_BGR2HSV);
	//Q1////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q1, pQ1);
	//Matの型変換(少数の積を正確にするため)
	pQ1[0].convertTo(Q1tmpQ1[0], CV_32F);
	pQ1[1].convertTo(Q1tmpQ1[1], CV_32F);
	pQ1[2].convertTo(Q1tmpQ1[2], CV_32F);
	//HSVの値を変更
	qQ1[0] = pQ1[0] * SQ1;
	qQ1[1] = pQ1[1] * HQ1;
	qQ1[2] = pQ1[2] * VQ1;
	merge(qQ1, 3, HSVQ1);
	//BGRに変換
	cvtColor(HSVQ1, BGRQ1, CV_HSV2BGR);
	namedWindow("Q1");
	imshow("Q1", BGRQ1);
	////////////////////////////////////////////////////////////////////////////////
	//Q2////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q2, pQ2);
	//Matの型変換(少数の積を正確にするため)
	pQ2[0].convertTo(Q2tmpQ2[0], CV_32F);
	pQ2[1].convertTo(Q2tmpQ2[1], CV_32F);
	pQ2[2].convertTo(Q2tmpQ2[2], CV_32F);
	//HSVの値を変更
	qQ2[0] = pQ2[0] * SQ2;
	qQ2[1] = pQ2[1] * HQ2;
	qQ2[2] = pQ2[2] * VQ2;
	merge(qQ2, 3, HSVQ2);
	//BGRに変換
	cvtColor(HSVQ2, BGRQ2, CV_HSV2BGR);
	namedWindow("Q2");
	imshow("Q2", BGRQ2);
	////////////////////////////////////////////////////////////////////////////////
	//Q3////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q3, pQ3);
	//Matの型変換(少数の積を正確にするため)
	pQ3[0].convertTo(Q3tmpQ3[0], CV_32F);
	pQ3[1].convertTo(Q3tmpQ3[1], CV_32F);
	pQ3[2].convertTo(Q3tmpQ3[2], CV_32F);
	//HSVの値を変更
	qQ3[0] = pQ3[0] * SQ3;
	qQ3[1] = pQ3[1] * HQ3;
	qQ3[2] = pQ3[2] * VQ3;
	merge(qQ3, 3, HSVQ3);
	//BGRに変換
	cvtColor(HSVQ3, BGRQ3, CV_HSV2BGR);
	namedWindow("Q3");
	imshow("Q3", BGRQ3);
	////////////////////////////////////////////////////////////////////////////////
	//Q4////////////////////////////////////////////////////////////////////////////
	//(H,S,V)に分離
	split(hsv_Q4, pQ4);
	//Matの型変換(少数の積を正確にするため)
	pQ4[0].convertTo(Q4tmpQ4[0], CV_32F);
	pQ4[1].convertTo(Q4tmpQ4[1], CV_32F);
	pQ4[2].convertTo(Q4tmpQ4[2], CV_32F);
	//HSVの値を変更
	qQ4[0] = pQ4[0] * SQ4;
	qQ4[1] = pQ4[1] * HQ4;
	qQ4[2] = pQ4[2] * VQ4;
	merge(qQ4, 3, HSVQ4);
	//BGRに変換
	cvtColor(HSVQ4, BGRQ4, CV_HSV2BGR);
	namedWindow("Q4");
	imshow("Q4", BGRQ4);
	////////////////////////////////////////////////////////////////////////////////
	//ファイルを閉じる
大量のエラーがでたはずですが?(入力時インテリセンスで”不完全な型は使用できません”という表示が大量にでたはずですが?)

コード:

1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core\persistence.hpp(679): error C2027: 認識できない型 'cv::Mat' が使われています。
1>  d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core\base.hpp(627): note: 'cv::Mat' の宣言を確認してください
1>  d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core\base.hpp(627): note: 'cv::Mat' の宣言を確認してください
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core\persistence.hpp(680): error C2027: 認識できない型 'cv::SparseMat' が使われています。
1>  d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core\base.hpp(632): note: 'cv::SparseMat' の宣言を確認してください
1>  d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core\base.hpp(632): note: 'cv::SparseMat' の宣言を確認してください
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(319): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(319): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(359): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(359): error C2146: 構文エラー: ')' が、識別子 'src1' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(399): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(399): error C2146: 構文エラー: ')' が、識別子 'src1' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(424): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(424): error C2146: 構文エラー: ')' が、識別子 'src1' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(447): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(447): error C2146: 構文エラー: ')' が、識別子 'src1' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(451): error C2061: 構文エラー: 識別子 'InputArray'
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(472): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(472): error C2146: 構文エラー: ')' が、識別子 'src1' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(496): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(496): error C2146: 構文エラー: ')' が、識別子 'src1' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(524): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(524): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(541): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(541): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(550): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(550): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(559): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(559): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(587): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(587): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(600): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(600): error C2146: 構文エラー: ')' が、識別子 'src' の前に必要です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.1.0\build\native\include\opencv2\core.hpp(622): error C2065: 'InputArray': 定義されていない識別子です。
1>d:\h\z10\cv\001\18\win32concv\packages\opencv3.1.

と成りのトトロ

Re: opencvによるHSVの変更

#3

投稿記事 by と成りのトトロ » 8年前

あ、失礼しました。OpenCV3.2を入れたため競合があったのか。OpenCV3.1を再インストールすると正常にビルド出来ました。

takezawaakiragm
記事: 26
登録日時: 8年前

Re: opencvによるHSVの変更

#4

投稿記事 by takezawaakiragm » 8年前

申し訳ありません。
開発環境を記載し忘れていました。
vs2013 
opencv3.1.0 となります

と成りのトトロ

Re: opencvによるHSVの変更

#5

投稿記事 by と成りのトトロ » 8年前

画像データがないので出来ませんでした。

takezawaakiragm
記事: 26
登録日時: 8年前

Re: opencvによるHSVの変更

#6

投稿記事 by takezawaakiragm » 8年前

ここでは,付与できる数が3枚上限だそうなので公開用googlephoteにアップロードしました。
bmpだと容量の問題があったため、pngにさせていただきました。

写真は計16枚ありますが、そのうち12枚は上に記載したようQ1,Q2,Q3,Q4 S1,S2,S3,S4, W1,W2,W3,W4 となります
他4枚のHSVQ1,HSVQ2,HSVQ3,HSVQ4は上記の式をもとに行った結果が画像となります.
見ていただくとHSVが調整されていないことが一目瞭然です。
[URL]
https://photos.google.com/share/AF1QipM ... c4R2NORndR

たびたび申し訳ありませんでした。
どなたかご教授お願いいたします。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: opencvによるHSVの変更

#7

投稿記事 by usao » 8年前

実際にコードを動作させたりなどはしていませんが…

>なぜかHSVがうまく変わっていません。

漠然としていて,問題点がはっきりしません.
(何を見てそう判断したのか? どうなれば「うまく変わった」と言えるのか?)


>[キャプチャ.png]
の話とコードとでは,画像の個数が異なるように見えるので,話がよくわかりません.
({s1~s12, w1~12, Q1~Q4} の26画像が必要な話に見えるが,コードでロードしているのは12画像)


#Hに適当な倍率を掛けるというのはかなり乱暴な処理な気もする…?

オフトピック
質問前に少しコードをまとめるくらいはしていただきたい…

・S1~S4, W1~W4,Q1~Q4 に対する処理内容が全て同じなら関数にまとめるとか
・>//Matの型変換(少数の積を正確にするため) → 32Fにしたものを特に使っていない.現在不要なのであれば除去して欲しい.

takezawaakiragm
記事: 26
登録日時: 8年前

Re: opencvによるHSVの変更

#8

投稿記事 by takezawaakiragm » 8年前

無事できました!
配列に求めた値をかける順序が違いました。
なぜかS,H,Vとなっていたため、通常とちがう色になってしまったようです。

ありがとうございます。

閉鎖

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