ページ 11

識別子が見つからないエラー

Posted: 2015年9月25日(金) 20:47
by もも
画像の色領域を抽出するプログラムを作成したいです。(赤だけ抽出してあとは黒表示するなど)
ネット上にあるサンプルプログラム等参考にしながら下記プログラムを書いてみましたが、

error C3861:'colorExtraction':識別子が見つかりませんでした

と出てうまくいきません。
関数の引数渡しがうまくいっていないのかと思うのですが
C++プログラム初心者でこのエラーの解決法がわからないのでご教授願えればと思います。
環境は 
 OS : Windows、VS2013、C++、openCV2.4.9
です。
初歩的なところでつまずいているのかもしれず、大変申し訳ないのですがよろしくお願いいたします。

以下、ソースコードです。

コード:

#include <iostream>
#include "opencv2\opencv.hpp"

int main(int argc, char *argv[])
{
	cv::Mat origImage = cv::imread("Color.png");
	cv::Mat extractedImage;

	cv::imshow("Color Image", origImage);

	colorExtraction(&origImage, &extractedImage, CV_BGR2HSV, 50, 70, 80, 255, 0, 255);

	cv::imshow("Extract Image", extractedImage);

	cv::waitKey(0);
	return 0;
}

void colorExtraction(cv::Mat* src, cv::Mat* dst,
	int code,
	int ch1_lower, int ch1_upper,
	int ch2_lower, int ch2_upper,
	int ch3_lower, int ch3_upper
	){


	cv::Mat color_Image;

	int lower[3];
	int upper[3];

	cv::Mat lut = cv::Mat(256, 1, CV_8UC3);

	cv::cvtColor(*src, color_Image, code);

	lower[0] = ch1_lower;
	lower[1] = ch2_lower;
	lower[3] = ch3_lower;

	upper[0] = ch1_upper;
	upper[1] = ch2_upper;
	upper[2] = ch3_upper;

	for (int i = 0; i < 256; i++){
		for (int k = 0; k < 3; k++){
			if (lower[k] <= upper[k]){
				if ((lower[k] <= i) && (i <= upper[k])){
					lut.data[i*lut.step + k] = 255;
				}
				else{
					lut.data[i*lut.step + k] = 0;
				}
			}
			else{
				if ((i <= upper[k]) || (lower[k] <= i)){
					lut.data[i*lut.step + k] = 255;
				}
				else{
					lut.data[i*lut.step + k] = 0;
				}
			}
		}
	}

	//LUTを使用して二値化
	cv::LUT(color_Image, lut, color_Image);

	//Channnelごとに分解
	std::vector<cv::Mat>planes;
	cv::split(color_Image, planes);

	//マスクを作成
	cv::Mat maskImage;
	cv::bitwise_and(planes[0], planes[1], maskImage);
	cv::bitwise_and(maskImage, planes[2], maskImage);
	
	//出力
	cv::Mat maskedImage;
	src->copyTo(maskedImage, maskImage);
	*dst = maskedImage;
}

Re: 識別子が見つからないエラー

Posted: 2015年9月25日(金) 21:24
by みけCAT
main関数の前にプロトタイプ宣言

コード:

void colorExtraction(cv::Mat* src, cv::Mat* dst,
	int code,
	int ch1_lower, int ch1_upper,
	int ch2_lower, int ch2_upper,
	int ch3_lower, int ch3_upper
	);
を書くとどうなりますか?

Re: 識別子が見つからないエラー

Posted: 2015年9月26日(土) 12:42
by もも
ありがとうございます。さっそく入れてみたところ、

ソリューション名.exeによってブレークポイントが発生しました。

というエラーに変わりました。
一番最後の行の } のところに矢印が出ており、
自動変数のところを見ると src の値が赤文字になっています。
これはどういう状況なのでしょうか。

お手数をおかけいたしますがよろしくお願い致します。

Re: 識別子が見つからないエラー

Posted: 2015年9月28日(月) 11:48
by usao
・画像のロードができているのか確認してみてはどうでしょう
・line38 : lower[3] = ch3_lower; ←領域外参照ではないでしょうか

Re: 識別子が見つからないエラー

Posted: 2015年9月28日(月) 14:24
by もも
ご指摘ありがとうございます。
usao さんが書きました:・画像のロードができているのか確認してみてはどうでしょう
・line38 : lower[3] = ch3_lower; ←領域外参照ではないでしょうか
line38のミスですが私の凡ミスでした。申し訳ありません。
lower[2] = ch3_lower;
に修正しました。

画像のロードができているかline6の部分を以下のコードに書き換え
確認してみたところ
-1が返ってきてちゃんとロードができていないようでした。
この辺りを確認しており、
・画像の部分を絶対パスにする
・読み込み画像を別のものにしてみる(OpenCVサンプルのbaboon.jpg)
を試みましたがうまくいきません。
何かほかに心当たりがあればどんなことでもいいのでご教授くださいませ。
よろしくお願いいたします。

コード:

cv::Mat origImage = cv::imread("c:\\baboon.jpg");
	if (origImage.empty()){
		return -1;
	}

Re: 識別子が見つからないエラー

Posted: 2015年9月28日(月) 17:21
by usao
>この辺りを確認しており、
>・画像の部分を絶対パスにする
>・読み込み画像を別のものにしてみる(OpenCVサンプルのbaboon.jpg)
>を試みましたがうまくいきません。

未だ画像の読込が成功していない,ということでしょうか.


>何かほかに心当たりがあればどんなことでもいいのでご教授くださいませ。

関係ないかもですが,
OpenCVのlibのデバッグ版とリリース版をうっかり間違っていたりすると
>ソリューション名.exeによってブレークポイントが発生しました。
みたいなことが起こったりしたような気がします.

Re: 識別子が見つからないエラー

Posted: 2015年9月28日(月) 19:01
by もも
ご返信ありがとうございます。

>未だ画像の読込が成功していない,ということでしょうか.

だと思っていたのですが、line11のcolorExtraction関数部分とline13のcv::imshow部分を
コメントアウトしてデバッグしたところ、ちゃんとColor.pngは表示されたのでそこではないようでした。

>OpenCVのlibのデバッグ版とリリース版をうっかり間違っていたりすると

というのは具体的にはどういう処置を取ればよいのでしょうか?
ローカルWindowsデバッガーの横のDebugとなっていた部分をReleaseに変えてみましたが、エラーは変わりませんでした。

また、関数内を徐々にコメントアウトしていく方法も試してみたのですが、
line70 cv::split(color_Image, planes);
以降をコメントアウトした場合はエラー
「ソリューション名.exeによってブレークポイントが発生しました。」
が出ないのですが、
このline70をプログラムに組み込んだらエラーが出るようになりました。

cv::split(color_Image, planes);
この処理が良くないのでしょうか。

どなたか心当たりがあればご教授くださいませ。
よろしくお願い致します。

Re: 識別子が見つからないエラー

Posted: 2015年9月28日(月) 20:01
by usao
>lower[2] = ch3_lower;
>に修正

を行った状態のコードを
私の環境(Win7, VisualStudio2012, OpenCV2.3.1)で実行してみましたが,
とりあえずエラーで止まることなく動作しているように見えます.
(入力画像はてきとーなのを与えました.)


>>OpenCVのlibのデバッグ版とリリース版をうっかり間違っていたりすると
>
>というのは具体的にはどういう処置を取ればよいのでしょうか?

(少なくとも私が使っているOpenCV2.3.1では)OpenCVのlibは
例えば opencv_core231.lib と opencv_core231d.lib のようにlibが2つあって,
Releaseビルド時は前者を,Debugビルド時は後者を使う,という話です.
(Debugビルドなのにファイルタイトル末尾に'd'が付いてない側を使ったり,
 その逆:Releaseビルドで'd'付き側を使う を行うとダメ)

Re: 識別子が見つからないエラー

Posted: 2015年9月28日(月) 21:48
by もも
やはりline70のcv::splitがうまくいっていないようだったので
line69の std::vector<cv::Mat>planes; 

cv::Mat planes[3];
に変えてみたところ、うまくプログラムが動作し、指定の色のみ抽出できるようになりました!

質問に答えてくださった方々、気にかけてくださった方々、本当にありがとうございました。