初期化されていないローカル変数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aaaa

初期化されていないローカル変数

#1

投稿記事 by aaaa » 7年前

こんにちは
C言語初心者です。
私は画像をRGBからHSVに変換したいと考えています。

以下のようなプログラムを書いたら、cvCvtColorのところで「初期化されていないローカル変数 [hsv_image] が使われています。」という警告を受けました。
=0や=NULLのようなことをしてもエラーが出てしまいます。対処法がありましたら教えてください。皆様どうかよろしくお願いします。

コード:

//インクルード
#include "stdafx.h"
#include "C:\Program Files\opencv\build\include\opencv2\opencv.hpp"

//ライブラリ
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_core240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240d.lib")




int main(int argc, char** argv){

	

	//画像領域の確保
	IplImage *LoadImage;
	IplImage *hsv_image;

	//画像の読み込み
	LoadImage = cvLoadImage("Z:\\win\\Desktop\\zemi\\image.jpg",CV_WINDOW_AUTOSIZE);

	//表示ウィンドウの作成
	cvNamedWindow("ImageOut",CV_WINDOW_AUTOSIZE);
	
	//読み込んだ画像の表示
	cvShowImage("ImageOut",LoadImage);

	cvCvtColor(LoadImage, hsv_image, CV_BGR2HSV);
	
	cvNamedWindow("HSV" ,CV_WINDOW_AUTOSIZE);

	cvShowImage("HSV",hsv_image);

	//何かを押すまで待機
	cvWaitKey(0);

	//後始末
	cvReleaseImage(&LoadImage);
	cvDestroyAllWindows();

	return 0;
}



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

Re: 初期化されていないローカル変数

#2

投稿記事 by usao » 7年前

> 以下のようなプログラムを書いたら、cvCvtColorのところで「初期化されていないローカル変数 [hsv_image] が使われています。」という警告を受けました。

こちらはビルド時の警告で,

> =0や=NULLのようなことをしてもエラーが出てしまいます。

こちらは実行時のエラーの話でしょうか?
現在問題としているのは後者の側であって,前者の警告は解消した,という話ですか?
オフトピック
いくらなんでも質問文が雑すぎるのではありませんか?
「フォーラムルールがどうの」と言うと,途端に何故か第三者から激しく攻撃され得るので,こういうことはあまり言いたくないのですが.

で,後者側のエラーに関してですが,
cvCvtColor()が引数に求める条件を把握していますか?

・把握していて,それに則ってコーディングしたのに問題が生じている,ということであれば,そういう事柄を説明してください.
・把握していないのであれば,リファレンスマニュアルあたりで調べてください.hsv_imageに求められている事柄がわかるハズです.

オフトピック
> LoadImage = cvLoadImage("Z:\\win\\Desktop\\zemi\\image.jpg",CV_WINDOW_AUTOSIZE);
ここに CV_WINDOW_AUTOSIZE なんてのを渡しているのも間違いですよね.
たまたま定数値が大丈夫で動くのでしょうけど.

aaaa

Re: 初期化されていないローカル変数

#3

投稿記事 by aaaa » 7年前

usao 様
不快にさせてしまったのであれば大変申し訳ありません。
私はC言語に加え、日本語も初心者のためこのような失態をしてしまいました。
しかし私には悪気はないのでどうかお許しください。フォーラムルール後ほど読ませていただきます。
また、私はあなたの元で大きく成長したと感じています。
その証拠に私はHSV変換に限りなく近づきました。

画像を添付します。
しかし、新たに問題が発生しました。
変換した前と後で色が違うのです。
私はてっきり同じ画像が二つ表示されるのだと思っていましたが、そうではありませんでした。
これは私にとって正しいのか間違っているのか見当も付きません。

プログラムは以下の物です。

コード:

//インクルード
#include "stdafx.h"
#include "C:\Program Files\opencv\build\include\opencv2\opencv.hpp"

//ライブラリ
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_core240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240d.lib")




int main(int argc, char** argv){

	

	//画像領域の確保
	IplImage *LoadImage = cvCreateImage(cvSize(240,320),IPL_DEPTH_8U, 3);
	IplImage *hsv_image = cvCreateImage(cvGetSize(LoadImage), IPL_DEPTH_8U, 3); 

	//画像の読み込み
	LoadImage = cvLoadImage("Z:\\win\\Desktop\\zemi\\image.jpg",CV_WINDOW_AUTOSIZE);

	//表示ウィンドウの作成
	cvNamedWindow("ImageOut",CV_WINDOW_AUTOSIZE);
	
	//読み込んだ画像の表示
	cvShowImage("ImageOut",LoadImage);

	cvCvtColor(LoadImage, hsv_image, CV_BGR2HSV);
	
	cvNamedWindow("HSV" ,CV_WINDOW_AUTOSIZE);

	cvShowImage("HSV",hsv_image);

	//何かを押すまで待機
	cvWaitKey(0);

	//後始末
	cvReleaseImage(&LoadImage);
	cvReleaseImage(&hsv_image);
	cvDestroyAllWindows();

	return 0;
}



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

Re: 初期化されていないローカル変数

#4

投稿記事 by usao » 7年前

> これは私にとって正しいのか間違っているのか見当も付きません。

「正しい変換が行われているのか,それとも行えていないのか」に関しては,
処理結果画像の画素値を直接調べて確認すれば判断できるのでないでしょうか.


IplImageは,「画素値がどのような色表現なのか(BGRなのかHSVなのか,その他の形式なのか)」といった情報を 保持しません.

よって,
「hsv_imageはHSVの値として画素データを保持しているはずであるから,BGR画像の場合とは異なる方法で扱わねばならない」
といったような判断は,あなたが行わねばなりません.

cvShowImage()には,引数に渡された画像の色表現を知る術がないので,そういった判断を行うことができません.
8bit3chの画像が渡された際には,画素値の情報を BGR だとみなして表示を行うハズです.
LoadImage と hsv_image とでは,画像データの画素値が異なるハズですから,cvShowImage()による表示結果が異なるのは当然です.

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

Re: 初期化されていないローカル変数

#5

投稿記事 by usao » 7年前

オフトピック
LoadImage に関して,最初にcvCreateImage()で生成した領域が解放されていなさそうですね.
(cvLoadImage()でファイルから読むのであれば,事前のcvCreateImage()は不要なのでは)

Math

Re: 初期化されていないローカル変数

#6

投稿記事 by Math » 7年前

OpevCVの設定がおかしいように思われますが。

コード:

//インクルード
#include "stdafx.h"
#include "C:\Program Files\opencv\build\include\opencv2\opencv.hpp"
 
//ライブラリ
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_core240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240d.lib")
#pragma comment(lib,"C:Program Files\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240d.lib")
 
はVersionはなにでしょうか?

OpenCV2.4.11でテスト。下記はビルドできます。

コード:

//インクルード
#include "d:\\opencv\\build\\include\\opencv2\\opencv.hpp"
#include "d:\\opencv\\build\\include\\opencv2\\core\core.hpp"
#include "d:\\opencv\\build\\include\\opencv2\\highgui\\highgui.hpp"
//ライブラリ
#pragma comment(lib,"d:\\opencv\\build\\x86\\vc11\\lib\\opencv_core2411d.lib")
#pragma comment(lib,"d:\\opencv\\build\\x86\\vc11\\lib\\opencv_highgui2411d.lib")
#pragma comment(lib,"d:\\opencv\\build\\x86\\vc11\\lib\\opencv_imgproc2411d.lib")
#pragma comment(lib,"d:\\opencv\\build\\x86\\vc11\\lib\\opencv_objdetect2411d.lib")
// プログラムは main から始まります(Entry Point:main) 
int main(int argc, char** argv){

	//画像領域の確保
	IplImage *LoadImage = cvCreateImage(cvSize(240, 320), IPL_DEPTH_8U, 3);
	IplImage *hsv_image = cvCreateImage(cvGetSize(LoadImage), IPL_DEPTH_8U, 3);

	// 幅320px、高さ240pxで赤色の画像データを生成
	cv::Mat redImg(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));

	redImg = cvLoadImage("d:\\dat\\m.jpg", CV_WINDOW_AUTOSIZE);


	// 画像表示用のウィンドウを生成
	cv::namedWindow("red", cv::WINDOW_AUTOSIZE);

	// ウィンドウに画像を表示
	cv::imshow("red", redImg);
	/*
	//画像の読み込み
	//LoadImage = cvLoadImage("Z:\\win\\Desktop\\zemi\\image.jpg",CV_WINDOW_AUTOSIZE);
	LoadImage = cvLoadImage("d:\\dat\\m.jpg",CV_WINDOW_AUTOSIZE);

	//表示ウィンドウの作成
	cvNamedWindow("ImageOut",CV_WINDOW_AUTOSIZE);

	//読み込んだ画像の表示
	cvShowImage("ImageOut",LoadImage);

	cvCvtColor(LoadImage, hsv_image, CV_BGR2HSV);

	cvNamedWindow("HSV" ,CV_WINDOW_AUTOSIZE);

	cvShowImage("HSV",hsv_image);
	*/
	//何かを押すまで待機
	cvWaitKey(0);

	//後始末
	cvReleaseImage(&LoadImage);
	cvReleaseImage(&hsv_image);
	cvDestroyAllWindows();

	return 0;
}
見ている資料が古くありませんか。
ーーーーー
OpenCV2.0以降では、cv::Matが利用でき、初期化や後始末、さまざまな画像処理に関しても、扱いやすくなっているのですが、 既にある関数を利用したい場合には、一旦IplImageに変換しなくてはなりませんし、逆にIplImageをcv::Matへ変換したい場合もあります。

これらの変換ルーチンはcv::Matクラスで定義されていて、実際には非常に簡単に変換できます。 しかし、コーディング中は、何故か難しく考えすぎて、戸惑うことが多々ありますので、ここにまとめておきます。

opencv.jpの説明では、 変換後のインスタンスに「データはコピーされません」という記述がなされています。 これは、変換後のインスタンスは、元データを参照しているだけで、データ部分の複製はされないということです。 このため、変換後のオブジェクトを後始末する必要はありません(してはいけません)。

cv::MatからIplImageへの変換

cv::MatのインスタンスをIplImageに変換するには、そのまま代入するだけです。 ただし、代入先は、ポインタ(IplImage*)ではなくIplImageのインスタンスそのものです。

代入先のIplImageを、事後に無理やりcvReleaseImageで解放してはいけません。。

//変換元画像
cv::Mat mat(240, 320, CV_8UC3);

//変換先画像
IplImage iplImage = mat; //ポインターではない
IplImage iplImage2 = mat; // 〃

//後始末について

//変換先画像を以下のように無理に解放してはいけない。
// IplImage* pIplImage = &iplImage;
// cvReleaseImage(&pIplImage);
・・・・・・・・・・・・・・・・・・

アバター
asd
記事: 319
登録日時: 15年前

Re: 初期化されていないローカル変数

#7

投稿記事 by asd » 7年前

オフトピック
Math さんが書きました: ーーーーー
OpenCV2.0以降では、cv::Matが利用でき、初期化や後始末、さまざまな画像処理に関しても、扱いやすくなっているのですが、 既にある関数を利用したい場合には、一旦IplImageに変換しなくてはなりませんし、逆にIplImageをcv::Matへ変換したい場合もあります。

(略)
・・・・・・・・・・・・・・・・・・
後半の文章は以下からの転載でしょうか?
http://bicycle.life.coocan.jp/takamints ... conversion

よそのサイトの文章を貼り付けるのであれば転載元をきちんと明記したほうがよいですよ。

またトピックの流れを見る限り、質問者さんはHSV形式に変換された画像を表示したらRGB形式のものとは表示のされ方が異なっていたと報告しています。
それについてはusaoさんから指摘済みで質問者さんの返答待ちかと思いますが、あなたの投稿の意図は何でしょうか?
Matを使う方法もあるという情報提示でしょうか?
であれば、HSV形式への変換部分をコメントアウトしたままMatを使う方法だけを提示する意図がよくわかりません。
Advanced Supporting Developer
無理やりこじつけ(ぉ

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

Re: 初期化されていないローカル変数

#8

投稿記事 by usao » 7年前

> OpevCVの設定がおかしいように思われますが。

質問者側では少なくともビルド通って動いているであろうことが読み取れますが,
一体何がおかしいとの指摘なのでしょう? 具体的に示さないと意味不明です.

(問答無用でデバッグ版ライブラリなのかよ! とかいう話であれば,あなたのコードも同様ですし?)
オフトピック
質問者の文面には,たびたび
>C言語
という単語が見られることから,C++ではなくCの範疇でコードを組んでいるのではないかと予想.

aaaa

Re: 初期化されていないローカル変数

#9

投稿記事 by aaaa » 7年前

今私は皆様の返信を読ませていただいております。
しかし私は未熟なため理解するのに時間がかかることを申し訳なく思います。

また、前回の返信の時に画像を添付しわすれてしまいました。
今それをしようとしたのですが、こちらにはファイルをアップロードする機能がないのですね。
よろしければおすすめの画像挿入の方法を教えていただけると幸いです。

aaaa

Re: 初期化されていないローカル変数

#10

投稿記事 by aaaa » 7年前

>8bit3chの画像が渡された際には,画素値の情報を BGR だとみなして表示を行うハズです.

とても納得しました。ありがとうございます。
調べてみるとこうなることは必然で私は正しくHSV変換することができていたそうです。

これからは次のステップとして、特定の色を抽出したいと思います。

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

Re: 初期化されていないローカル変数

#11

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

aaaa さんが書きました:こちらにはファイルをアップロードする機能がないのですね。
いいえ。
aaaa さんが書きました:よろしければおすすめの画像挿入の方法を教えていただけると幸いです。
ユーザー登録してログインしていただくと、画像(など)を添付できるようになります。
ユーザー登録したくない場合は、Imgurなどを使うといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaaa

Re: 初期化されていないローカル変数

#12

投稿記事 by aaaa » 7年前

皆様ありがとうございます。
C++ 私も大変使いたい都考えています。
しかしなぜか使えないためC言語にてプログラムを作っています。


私は赤色と青色を抽出したいのです。
そしてそのためのコードをC++で見つけました。
それを頑張ってC言語で書くようにしています。

そのことについてまた新しくトピックを立てさせていただきたい都考えています。

Math

Re: 初期化されていないローカル変数

#13

投稿記事 by Math » 7年前

>C++ 私も大変使いたい都考えています。
>しかしなぜか使えないためC言語にてプログラムを作っています。

普通にはCが使えればC++も使えるようになっているはずと思います。(^^;
使っているOS(Windows10,Linuxなど) コンパイラ(VisualStudio2017,gccなど)

使っているOpevCVのVersion(2.4.13.3など)(インストールの方法:Nugetなど)を教えてくださいませんか。

(最新のOpevCV2系(Version2.4.13.3)で試したところ少し訂正して動作しました。)

アバター
asd
記事: 319
登録日時: 15年前

Re: 初期化されていないローカル変数

#14

投稿記事 by asd » 7年前

オフトピック
Math さんが書きました:>C++ 私も大変使いたい都考えています。
>しかしなぜか使えないためC言語にてプログラムを作っています。

普通にはCが使えればC++も使えるようになっているはずと思います。(^^;
使っているOS(Windows10,Linuxなど) コンパイラ(VisualStudio2017,gccなど)

使っているOpevCVのVersion(2.4.13.3など)(インストールの方法:Nugetなど)を教えてくださいませんか。

(最新のOpevCV2系(Version2.4.13.3)で試したところ少し訂正して動作しました。)
本題から逸れる内容のため新しいトピックへ誘導した方がよいのではと思います。
Advanced Supporting Developer
無理やりこじつけ(ぉ

返信

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