こんにちは。
私は今OpenCVを使い「赤と青どちらの画素数が多いかを調べたい」と考えています
しかし、私は大変初心者なので、調べても全くわかりませんでした。。。
cv::countNonZero という関数を使うのではないかということしかわかりませんでした(使い方もわかりませんでした。。。)
全く手付かずの状態で投げっぱなしの質問になってしまいますが、画素数の調べ方を教えていただけたら幸いです。
よろしくお願いします。
OpenCVを使い画素数を調べる
Re: OpenCVを使い画素数を調べる
訂正失礼いたします。
CountNonZeroの使い方がわからないというのは文字通りの意味と、この関数の意味もわからないということです。。。(リファレンスは一応読みました)
使い方に関しては
というプログラムをつくったのですが、
‘src_img’ was not declared in this scope
count +=CountNonZero(src_image);
とでてしまいました。
src_image ではないものを入れるの必要があるのでしょうか
CountNonZeroの使い方がわからないというのは文字通りの意味と、この関数の意味もわからないということです。。。(リファレンスは一応読みました)
使い方に関しては
using namespace cv;
int main(int argc, const char *argv[])
{
/*genga*/
Mat src_image = imread("red.jpg");
namedWindow("genga");
imshow("genga", src_image);
int width = src_image.cols;
int height = src_image.rows;
int count =0;
count +=CountNonZero(src_image);
printf("%d\n",count);
‘src_img’ was not declared in this scope
count +=CountNonZero(src_image);
とでてしまいました。
src_image ではないものを入れるの必要があるのでしょうか
Re: OpenCVを使い画素数を調べる
リファレンスによると、引数に渡されたシングルチャンネルの配列から0でない画素数をカウントし返すとありますので、aaaa さんが書きました:訂正失礼いたします。
CountNonZeroの使い方がわからないというのは文字通りの意味と、この関数の意味もわからないということです。。。(リファレンスは一応読みました)
例えばHSVチャンネルのHだけの画素数をカウントしたり、Sだけの画素数をカウントしたりといった使い方になるかと思います。
(参考)
http://opencv.jp/opencv-2svn/c/operatio ... l#index-23
もし以下の以前のトピックで上がっていた「赤の画素、青の画素をカウントする」目的では利用は難しいと思います。
(H、Sそれぞれの値が特定の範囲のものを赤または青としてカウントする必要があるため、Hチャンネルだけの画素をカウントしてもダメですし、Sチャンネルだけの画素をカウントしてもダメだと思いますので)
(以前のトピック)
http://dixq.net/forum/viewtopic.php?f=3&t=19609
それはさておき提示されたプログラムにも言及しておきますね。
出ているエラーはその1つだけでしょうか?aaaa さんが書きました: というプログラムをつくったのですが、
‘src_img’ was not declared in this scope
count +=CountNonZero(src_image);
とでてしまいました。
src_image ではないものを入れるの必要があるのでしょうか
閉じ括弧が足りないことと、プログラム中に存在していないsrc_imgという変数名でエラーが出ているので、
お手元のプログラムをよく確認し、
・src_imageのつもりでsrc_imgと書いている部分がないか
・閉じ括弧の対応は正しいか
を確認してみてください。
ただ、それを解決しても別のエラーが出るかと思いますので、いずれかのチャンネルだけを渡すようにすればカウントはしてくれるとは思います
(src_imageはシングルチャンネルの配列ではないためsplit関数なりで分解する必要がある)
これで動作するとよいのですが、分からない箇所があればまた聞いてください(*´ヮ`)
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: OpenCVを使い画素数を調べる
asd様
返信有り難うございます。
詳しい説明ありがとうございます。
CountNonZeroは一つのものしか数えられないのですね。。。
以前のトピックでおっしゃられていた、「その場合だとフラグ方式よりも、赤と青の各成分量(ピクセル数)をカウントするようにした方がよいのかもです。」とのことですが、これはどのような手法を使えばよいか教えていただくことはできないでしょうか。。。
よろしくお願いします
返信有り難うございます。
詳しい説明ありがとうございます。
CountNonZeroは一つのものしか数えられないのですね。。。
以前のトピックでおっしゃられていた、「その場合だとフラグ方式よりも、赤と青の各成分量(ピクセル数)をカウントするようにした方がよいのかもです。」とのことですが、これはどのような手法を使えばよいか教えていただくことはできないでしょうか。。。
よろしくお願いします
Re: OpenCVを使い画素数を調べる
毎度のことながら度々申し訳ございません
何か関数を使わなければいけないのかと思いましたが、自分なりにプログラムを作ってみたのでこれが考え方があってるのか教えていただけたら嬉しいです。
赤、青それぞれのif の中でカウントをすればいいのではないかと思いこうしてみました。
一応横280、縦200の赤色の画像を読み込んだら、赤56000、青0と出ました。
よろしくお願いします。
何か関数を使わなければいけないのかと思いましたが、自分なりにプログラムを作ってみたのでこれが考え方があってるのか教えていただけたら嬉しいです。
/*
* hsv change
*/
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace cv;
int main(int argc, const char *argv[])
{
/*genga*/
Mat src_image = imread("red.jpg");
namedWindow("genga");
imshow("genga", src_image);
int width = src_image.cols;
int height = src_image.rows;
/*
int count =0;
count +=CountNonZero(src_image);
printf("%d\n",count);
*/
/*HSV*/
Mat hsv_image;
cvtColor(src_image, hsv_image, CV_BGR2HSV);
uchar hue, sat, val;
Mat red_image = Mat(Size(width, height),CV_8UC1);
Mat blue_image = Mat(Size(width, height),CV_8UC1);
int flag_red = 0;
int flag_blue = 0;
/*ピクセル*/
int pixel_red = 0;
int pixel_blue = 0;
for(int y=0; y<height; y++)
for(int x=0; x<width; x++)
{
/*H,S,V*/
hue = hsv_image.at<Vec3b>(y, x)[0];
sat = hsv_image.at<Vec3b>(y, x)[1];
val = hsv_image.at<Vec3b>(y, x)[2];
/*red_detect*/
if((hue<10 || hue>170) && sat>45){
red_image.at<uchar>(y, x) = 0;
flag_red = 1;
pixel_red ++;
}
else
red_image.at<uchar>(y, x) = 255;
/*blue_detect*/
if((hue>75 && hue<90) && sat>60){
blue_image.at<uchar>(y, x) = 0;
flag_blue = 1;
pixel_blue ++;
}
else
blue_image.at<uchar>(y, x) = 255;
}
namedWindow("red_detect");
imshow("red_detect", red_image);
namedWindow("blue_detect");
imshow("blue_detect", blue_image);
/*
if(flag_red=1){
printf("red\n");
}
*/
if(flag_blue=1){
printf("blue\n");
}
printf("%d\n",pixel_red);
printf("%d\n",pixel_blue);
waitKey(0);
destroyAllWindows();
return 0;
}
赤、青それぞれのif の中でカウントをすればいいのではないかと思いこうしてみました。
一応横280、縦200の赤色の画像を読み込んだら、赤56000、青0と出ました。
よろしくお願いします。
Re: OpenCVを使い画素数を調べる
いえいえ、少しずつ進んでいる様子が見られて、私も回答しがいがあると思っていますのでお気になさらず。aaaa さんが書きました:毎度のことながら度々申し訳ございません
何か関数を使わなければいけないのかと思いましたが、自分なりにプログラムを作ってみたのでこれが考え方があってるのか教えていただけたら嬉しいです。
提示されているプログラムで考え方は正しいかと思います。
(CountNonZero利用で難しいとなった場合には提示されているプログラムと同じ考え方を回答するつもりでした)
赤色の画像でのピクセル数と画像全体のピクセル数も一致しているとのことで、数え間違いや重複カウントもなく
正しく動いていそうですね。
次はいろいろな信号機画像で試してみてうまく判定できるかを確認する段階でしょうか。
正しく判定できない画像が見つかった場合にはどのように改善するかを検討することになろうかと思いますが、
引き続き頑張ってください(*´ヮ`)
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: OpenCVを使い画素数を調べる
オフトピック
ご指摘ありがとうございます。沖 滉均 さんが書きました:インデントはともかく、if文の中がフラグの判定ではなく代入になっているのでご注意を…
確かに代入になってしまっているので正しく判定されない事象につながってしまいますね。
見返してみると前のトピックから同じ記述だったのでその時から見落としていたようです…
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: OpenCVを使い画素数を調べる
asd様、 沖 滉均様、返信ありがとうございます。
asd様
おかげさまで、手元にある画像では無事に判別することができました。
本当にありがとうございます。
>正しく判定できない画像が見つかった場合にはどのように改善するかを検討することになろうかと思いますが、
引き続き頑張ってください(*´ヮ`)
ありがとうございます。またお助けをお願いすることがあるかもしれませんがその時はよろしくお願いします。
沖 滉均様
以前のプログラムで正しく判別できなかった理由が代入になっていたということがわかりました。
ご指摘ありがとうございます。
皆様感謝いたします。
asd様
おかげさまで、手元にある画像では無事に判別することができました。
本当にありがとうございます。
>正しく判定できない画像が見つかった場合にはどのように改善するかを検討することになろうかと思いますが、
引き続き頑張ってください(*´ヮ`)
ありがとうございます。またお助けをお願いすることがあるかもしれませんがその時はよろしくお願いします。
沖 滉均様
以前のプログラムで正しく判別できなかった理由が代入になっていたということがわかりました。
ご指摘ありがとうございます。
皆様感謝いたします。
Re: OpenCVを使い画素数を調べる
無事に解決したようでなによりです(*´ヮ`)aaaa さんが書きました: asd様
おかげさまで、手元にある画像では無事に判別することができました。
本当にありがとうございます。
タイミングによっては私が回答できる保証はないのですが、aaaa さんが書きました: ありがとうございます。またお助けをお願いすることがあるかもしれませんがその時はよろしくお願いします。
またトピックをお見かけした際には助言ができたらなと思っています。
頑張ってください!
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ