Opencv画像処理 bmp処理
常々自分の理解力の無さに呆れるyuki-yutoです。
今回はOpencvで作ったプログラムと別のプロジェクトで作ったプログラムをソースをコピーして一つにしたところ、オバーフロー?してしまうらしくプログラムが実行できません。
二つ別々なら動くので関数の受け渡しが悪いのでしょうか?
今回の処理の目的は Opencvでキャプチャ→bmpで保存→(書いていませんが)for文でRGBの量を求める→一定量のRが検出されればショートカットを起動する というものです。
RGBに関してはfor(i=0;i<width;i++)とかでまわしているソースを何処かで見た気がするのですが、bmp処理は疎いので正直RGBをどうやって出すかまだ良くわかっていません。
widthまでを使っているあたり1pixel毎配列にでも記録させているのでしょうか・・・?
#include <stdio.h>
#include <Windows.h> //bmp読み込み,ショトカ
#include<iostream>
#include <C:\OpenCV2.1\include\opencv\cv.h>
#include <C:\OpenCV2.1\include\opencv\highgui.h>
#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210d.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210d.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210d.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210d.lib")
#else
//Releaseモードの場合
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210.lib")
#pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210.lib")
#endif
#include <math.h>
#include <stdlib.h>
int main(void){
//画像保存用
char str[32];//大きさは多く取っておいたほうが良いかも?640*480対応できるように。
//キー入力用
int key;
//カメラの用意
CvCapture *capture;
IplImage *frame = NULL; //カメラ画像用
//カメラ・デバイスの先頭ポインタを取得
capture = cvCaptureFromCAM(-1);
//カメラ画像のサイズ
double height = 240;
double width = 320;
//カメラ初期化
if(capture == NULL){
//カメラが見つからなかった場合
printf("カメラが見つかりません\n");
return (0);
}
//カメラ画像を表示するウィンドウの生成
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
cvNamedWindow("CaptureFromCamera", CV_WINDOW_AUTOSIZE);
//キー入力されたら画像をキャプチャ
while(1){
//カメラ画像からフレーム画像を取り込む
frame = cvQueryFrame(capture);
if(frame == NULL)
break;
//画像の表示
cvShowImage("CaptureFromCamera", frame);
//sキー入力で画像を保存、Escキー入力でループから抜ける
key = cvWaitKey(10);
if(key == '\x1b')
break;
else if(key == 's'){
sprintf_s(str, "Capture_Bitmap.bmp");
cvSaveImage(str, frame);
}
}
//ウィンドウの破棄
cvDestroyWindow("CaptureFromCamera");
}
//ここからキャプチャしたbmp処理。
int main( int argc, char *argv[] ){
FILE *fp; //ポインタ、読み込み専用
BITMAPFILEHEADER bfh; //ファイルヘッダ
BITMAPINFOHEADER bmpinfo; //情報ヘッダ
//BMPファイルがあるかどうかチェック
if((fp=fopen("Capture_Bitmap.bmp","rb"))==NULL){
printf("ファイルが見つかりません");
exit(1);
}
//BMPファイルか確認
fread(&bfh, 14, 1, fp); //ファイルヘッダ読み込み,ってかファイルヘッダの1~14を読み込む
if(memcmp(&bfh.bfType,"BM",2)) //BMPファイルかチェック、2バイト位置にBMがあるか
printf("BMPファイルではありません");
fread(&bmpinfo, 40, 1, fp); //情報ヘッダ読み込み
printf("データの大きさは%dMB\n",(bmpinfo.biSizeImage+bmpinfo.biSize)/1000000); //表示サイズ調節
//何色BMPファイルか返却値で判定
switch(bmpinfo.biBitCount){
case 1: printf("2色ビットマップ\n"); break;
case 4: printf("16色ビットマップ\n"); break;
case 8: printf("256色ビットマップ\n"); break;
case 24: printf("1677色ビットマップ\n"); break;
case 32: printf("1677色ビットマップ\n"); break;
}
//ココでRGBを抽出する、確かforを二回bmpの縦と横の最大値まで繰り返し、何か変数に入れるソースを見た気が・・・?
printf("インターネット ショートカット を起動します。Enterを押してね");
getchar();
//ショトカ起動文。Windows.hでデスクトップにショートカットを指定。
fclose(fp);
rewind(stdin);
getchar();
}
お礼
ありがどうございます。 とても参考になりました。 ガンバってみます。