指定した領域のBGRをcsvに抽出 opencv3.1.0/vs2013

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

指定した領域のBGRをcsvに抽出 opencv3.1.0/vs2013

#1

投稿記事 by takezawaakiragm » 8年前

現在、opencvを用いて、画像の指定した領域のBGRを求め、csvに保存するプログラムを実装しています。
BGRを求め、csvに出力するまでは実装できたのですが、画像サイズより大きい位置を指定した場合も、
値が抽出されてしまいます。また、この値が一定であればまだわかるのですが、バラバラであり、
何を示しているのかわからない状態です。

教えて頂きたいこと
①画像サイズより大きい位置の値を入力したとき、エラー処理をだす。
 もしくは、実行できてもよいが、値を一定にし、分かりやすいようにしたい。

②全体的に直したほうがよいところ、間違っているところについて。
ご教授お願いします。

[version]
opencv3.1.0
vs2013

コード:

#include<iostream>
#include<opencv/cv.h>
#include<opencv/highgui.h>
#include<opencv2/opencv.hpp>
#include<fstream>
#include<stdio.h>
using namespace std;[attachment=0]位置と値.PNG[/attachment][attachment=0]位置と値.PNG[/attachment][attachment=0]位置と値.PNG[/attachment]
using namespace cv;

IplImage *img;
int main(int argc, char **argv)
{
	FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;
	errno_t error;

	int x, y;
	int count1 = 0, count2 = 0, count3 = 0;

	//領域1
	uchar q[3];
	//領域2
	uchar r[3];
	//全画素
	uchar p[3];

	//ある領域の輝度値/////////////////////////////////////////////////
	int value;	
	      //領域1//					      //領域2//
	     //開始位置						  開始位置
	int  y1 = 0, x1 = 0;         int y2 = 1987, x2 = 1987;
	     //幅 				                幅 
	int   a1 =  3;			            int b1 = 0;
	    //高さ								高さ
	int	  a2 = 200;                      int  b2 = 0;
	////////////////////////////////////////////////////////////////////
	int height1 = y1 + a1,
		width1 = x1+a2, 

		height2 = y2 + b1,
		width2 = x2 + b2;
		


	
	//読み込む画像
	//img = cvLoadImage(("1.png"), CV_LOAD_IMAGE_COLOR);
	img = cvLoadImage(("R2.png"), CV_LOAD_IMAGE_GRAYSCALE);


	if ((error = fopen_s(&fp1, "位置1.csv", "w"))){
		return 0;
	}
	if ((error = fopen_s(&fp2, "value1.csv", "w"))){
		return 0;
	}


	//領域1の(B,G,R)を順次取得
	printf("領域1");
	for (y = y1; y < height1; y++) {
		for (x = x1; x < width1; x++) {
			// BGRの取得
			printf("位置(%d,%d)\n",y,x);
			q[0] = img->imageData[img->widthStep * y + x * 3];        // B
			q[1] = img->imageData[img->widthStep * y + x * 3 + 1];    // G
			q[2] = img->imageData[img->widthStep * y + x * 3 + 2];    // R

			printf("B:G:R");
			printf("(%d,", q[0]);
			printf("%d,", q[1]);
			printf("%d)\n", q[2]);

			count2++;
			if (count2 % 10 != 0){
				//位置
				fprintf(fp1, ",(x:%d/y:%d),,",y,x);
				//値
				fprintf(fp2, "%d,%d,%d,", q[0], q[1], q[2]);
			}
			else{
				//位置
				fprintf(fp1, ",(x:%d/y:%d),\n", y,x);
				//値
				fprintf(fp2, "%d,%d,%d\n", q[0], q[1], q[2]);
			}
		}
		

	}
	
	// 領域2の(B,G,R)を順次取得
	for (y = y2; y < height2; y++) {
		for (x = x2; x < width2; x++) {
			// BGRの取得
			printf("位置(%d,%d)\n", y, x);
			r[0] = img->imageData[img->widthStep * y + x * 3];        // B
			r[1] = img->imageData[img->widthStep * y + x * 3 + 1];    // G
			r[2] = img->imageData[img->widthStep * y + x * 3 + 2];    // R

			printf("B:G:R");
			printf("(%d,", r[0]);
			printf("%d,", r[1]);
			printf("%d)\n", r[2]);

			count3++;
		}
	}

	/*

	
	//全画素(B,G,R)を順次取得
		for (y = 0; y < img->height; y++) {
			for (x = 0; x < img->width; x++) {
				// BGRの取得
				// 画素値を直接操作する一例 
				p[0] = img->imageData[img->widthStep * y + x * 3];        // B
				p[1] = img->imageData[img->widthStep * y + x * 3 + 1];    // G
				p[2] = img->imageData[img->widthStep * y + x * 3 + 2];    // R
				
				printf("B:G:R");
				printf("(%d,", p[0]);
				printf("%d,", p[1]);
				printf("%d)\n", p[2]);

				count1++;
				//BGRの設定
				img->imageData[img->widthStep * y + x * 3] = cvRound (p[0] * 0.6 + 10);
				img->imageData[img->widthStep * y + x * 3 + 1] = cvRound (p[1] * 1.0);
				img->imageData[img->widthStep * y + x * 3 + 2] = cvRound (p[2] * 0.0);

			}
		}
		
		*/

		
		printf("領域1の総数:%d\n", count2);
		printf("領域2の総数:%d\n", count3);
		printf("全画素の総数:%d\n", count1);
		
		cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
		cvShowImage("Image", img);
		cvWaitKey(0);

		cvDestroyWindow("Image");
		cvReleaseImage(&img);
		
		fclose(fp1);
		fclose(fp2);
		//fclose(fp3);
		//fclose(fp4);
		//fclose(fp5);
		//fclose(fp6);

		return 0;
	
}
添付ファイル
位置と値.PNG
位置と値
位置と値.PNG (42.33 KiB) 閲覧数: 1845 回
R1.png
画像(20x10)
R1.png (1.09 KiB) 閲覧数: 1845 回

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

Re: 指定した領域のBGRをcsvに抽出 opencv3.1.0/vs2013

#2

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

takezawaakiragm さんが書きました:画像サイズより大きい位置の値を入力したとき、エラー処理をだす。
画像サイズの外の値が入力されたらエラー処理をだせばいいでしょう。

コード:

// cvLoadImageの後、fopen_sの前に入れる
if (y1 < 0 || x1 < 0 || img->height < height1 || img->width < width1){
	puts("エラー処理");
	cvReleaseImage(&img);
	return 1;
}
// 領域2も同様に
takezawaakiragm さんが書きました:実行できてもよいが、値を一定にし、分かりやすいようにしたい。
値を一定にし、分かりやすいようにすればいいでしょう。

コード:

if (0 <= y && 0 <= x && y < img->height && x < img->width){
	q[0] = img->imageData[img->widthStep * y + x * 3];        // B
	q[1] = img->imageData[img->widthStep * y + x * 3 + 1];    // G
	q[2] = img->imageData[img->widthStep * y + x * 3 + 2];    // R
} else {
	q[0] = 0;    // B
	q[1] = 0;    // G
	q[2] = 0;    // R
}
takezawaakiragm さんが書きました:全体的に直したほうがよいところ、間違っているところについて。
領域1の処理と領域2の処理がほぼ同じなので、関数にして再利用するようにするといいかもしれないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)


閉鎖

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