【Intel】OpenCV総合スレ 5画素目【画像処理】
■ このスレッドは過去ログ倉庫に格納されています
OpenCVはインテルが公開したオープンソースのコンピュータービジョンライブラリ。
現在はWillowGateが開発している。
本家
http://opencv.willowgarage.com/wiki/
日本語資料など
http://opencv.jp/
前
【Intel】OpenCV総合スレ 4画素目【画像処理】
http://toro.2ch.net/test/read.cgi/tech/1329040627/ 変数作って指定面積以下ならラベリング結果を格納するようにして採番したらいいだけでは >>612
これをそのままプログラムにすればいいと思う。 ラベリングで物体ごとにラベリングできないから領域統合してうまくラベル付けできるようにしようとした
watershedで出来ないかやってみたらラベル付けができなくなっちゃった
なんかいい方法ない? 肝心なの忘れてた
環境は
opencv3.1 c++ visual studio 2015 >>615
何で物体ごとにできないの?画素がつながってないから? >>617
複雑な形かつ輪郭が繋がってる部分もあるから
一つずつラベリングしたいけど二つまとめてとかになってしまう そういうのはどういう画像かによるからエスパーじゃなきゃわからないよ・・・ 公式でC#に対応してくれんかな
OpenCVSharpの人とか頑張ってくれてるけども 質問です。
cv::Matに画像ファイルを入れる場合は、cv::imreadなのはわかりました。
unsigned char Gray[Y][X]のようなバッファを、cv::Matに代入するには、どうするのでしょうか。 for文をネストして多次元配列の中身を一つひとつ丁寧にdataメソッドでMatクラスに移植する >>623
俺のアルゴリズムぱくんなよ
todo修正コメントは入れとくがw 赤青のLEDを別々に認識させたいんですが、RGBの閾値よりHSVのほうがうまく認識させられますかね? あとカメラのオートフォーカスや露光調節をしたいんですが、highguiでは無理ですか? >>628
場合による
色空間のチャンネルをsplitしてinRangeメソッドで判定するのがスマート
>>629
v4l2-ctl --set-ctrl=contrast=0 >>630
opencvでは無理なんですね…
プログラミング全然できない自分にとっては敷居が高そうです ステレオマッチングでなんかやろうとおもってggったんだが、ネットに落ちてるサンプルコード的なのがまったくうごかん助けてくれ…
Xcodeで動かしてるんだけど、なんとか修正しようとしてもcvLoadImageがNULLしか返さん >>630
>色空間
て
一般的にどんなのがあるのでしょう。
次元が多いもの、付加情報足せるものとか、あるのでしょうか。 >>631
カメラ制御はカメラのライブラリを使え。
OpenCVにあるのは基本的にwebカメラを最低限に動かす程度、ってか全てのカメラを制御するコマンドなんてエスパーじゃないと作れん。
カメラ制御コマンドに共通規格がある訳じゃないし。 cv::imread使えよ>>632
そんな化石みたいな関数使ってもいいことない
とはいえどうせ画像パスがサンプルコードのままとかいうオチだろうけど >>635
教授にUSBカメラのデバイス設定で露出とかそういうの変えられるでしょ?みたいに言われたんですが、制御、設定するプログラミングを別で組まない無理ですよね? 何したいのか知らんけどガンマ補正かけたりして補正するんじゃだめなんかい
せっかくのopencvだからそういう使い方しようよ
あくまでソフトだから、基本的にハードの制御は他でやるべき 「USBカメラのデバイス設定」はopencvじゃないでしょ
USBカメラのデバイス設定では変えれるし、例えばwindowsなら汎用の設定方法が用意されてるからそれ使えばプログラム上から設定できる >>636
レスありがとう
パスは変えてるよ、流石に
cv::Mat使ってみたんだけど俺の理解力不足なのかまったく使い物にならん
http://daily-tech.hatenablog.com/entry/2016/06/25/233203
このブログの3個目のプログラムなんだが、CVStereoGC〜ってやつはぜんぶGC→BMって変更加えるってことしかわからんかった
誰か詳しく教えてエロい人 何で2016年にIplimageとか使ってんだよ・・・w
matに書き換えるのきついならとりあえずデバッグしてみーよ
そもそもエラーメッセージは何? ちょっと調べてみたら
StereoGCちゃんは3.系になったときにリストラされてるねwドマーイ >>632 です
>>643
まじすか、2.4.13.2でもないっぽいんでGC系は削除されてるんすね…
>>644
はビルド通ったけど実行したら怒られましたね
>>641
の修正したけどエラー出るソース乗っけた方がいいですか?長いしクソコードです 意訳「まだエスパー検定試験した方がいいか?まだ続けようか?」 ステレオマッチングなんてそこら中にすぐ動くソースあるんじゃねえの
めんどくせえからキネクト買え hough変換調べてるとよく
http://i.imgur.com/obLDsYA.png
こういう画像見かけるけど
これってどうやって作成するのだ? >>649
バリバリに動くよ
もちょい調べたら
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11160807996
のソースで動いた
は 書いてること同じのような気がするんだが何が違うのか…
一同ありがとう
IplImageじゃないと動かないみたいだし, Matからの変換も上手くいかないし大人しく化石つかうわ
IplImageってOpenCV界隈じゃもうクソ規格なのかい? opencvのバージョン何?
クソ規格というか、もはや使われていない
過去の遺産的に一応残っているだけ状態 >>652
上にも書いてる通りに2.4.13.2だよ
3.x系が最新で遺産が多い2.4.x系がメンテ程度に更新されてるって認識でいいのかい?
最近触ったばっかだからまったくわからん 少し違う
3系でもまだ一応遺産は残ってる
ただ新しい関数ではもちろん使われないし、
StereoGCちゃんのように随時削除されていったりする だからどうしてもStereoGCちゃん使いたいから旧版使わないといけない!
とかいう場合を除いて基本的に最初に入れる時は最新版の導入がよいよ >>655
できればStereoGC使いたかったんだけど、これ以上頭混乱したくないし大人しくStereoBMで我慢しとく
丁寧な説明トンクス またわかんないことあったら来るよ Iplimageって過去の遺産なのか…
カメラから画像取得でずっとIplimage使ってたわ
2.4.9です 質問です
画像を二値化したとき、白の集団が二つあり、それぞれで認識させるってことは可能なのでしょうか? findcontoursやラベリング関数で出来そう なんで画素が連続してる前提なんだよ
集団が2つと既知ならk-meansを使えばいい opencv超初心者なんですけど、カメラによるリアルタイムの映像にping画像を透過することって出来ますか? 誤差拡散(たとえばFloyd-Steinberg)で二値化したい場合ってバカ正直に1ピクセルずつ読んで散らしていくしかないのか?
特にインタプリタだと処理時間がバカにならないんでOpenCVの機能を使って速く計算出来ないのかな
OpenCVで計算できないのであればMatのピクセル値とインタプリタの配列を高速に相互変換出来る方法でも良い
ruby-opencvでやっているけどRubyがピクセル値を計算している時間よりMatを読み書きしている時間の方が長いw mat.at(y,x)とBGRの罠はいい加減どうにかならないのか… コンピューターの画面は左上が原点になるよう設計されてるからな
タイムマシン発明して変えてこい BMPはわざわざ左下原点にしてるからややこしいことになる Mat::atと原点位置は関係ないと思うが。低い次元(x)が後の引数なのが違和感あるってことだろ?
Rとかだとxを省略したら行ベクトルを意味するとか合理性はあるんだが、OpenCVのatは
1引数で呼んだ時の動作はなんか適当だね。 CからCvMat@OpenCV2.4のピクセル値を読み書きしたいのですがどのようにしたらいいですか?
ググってもC++からやっている事例ばかり引っかかってCから操作している例を見つけられませんでした
dataあたりから出来そうな気もするのですが・・・ cv:Mat
の
平行移動サンプルコード
くださいorz Mat frame = cv::imread
とかやって、
frameの画像を下方向に1ピクセル移動、右方向に2ピクセル移動、
は、コーディングはどうなりますでしょうか。 いや、補完の処理をどうすんのかって話
はみ出た部分は消滅させるのか、移動した分だけ画像サイズがでかくなるのか
動いた穴の部分は黒塗りでいいのか
とか 同じ大きさが良いです
はみ出た部分は消失です。
動いた部分、黒塗りしたいです。 void hoge(Mat src, Mat &dst, int dx, int dy) {
Rect rect(max(0, -dx), max(0, -dy), src.cols-abs(dx), src.rows-abs(dy));
Mat sub = Mat(src, rect).clone();
dst = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat roi(dst, Rect(max(0, dx), max(0, dy), dst.cols-abs(dx), dst.rows-abs(dy)));
sub.copyTo(roi);
}
dxとdyが移動量、それぞれ画像の右方向、下方向が正ね あ、CV_8UC3はsrc.type()の方がよかったね
まあエラーとかも含めてその辺適当に。。
要するに、生き残る範囲を選択した後、黒塗りの画像上の移動先に貼り付けるだけ。 意外だったのは、
>Matなんだから→行列計算で移動のアフィン変換
だと思っていたのに、
Rectで解決なんですね。
基本的な考え方がわかったような気がします。
次には、回転を自分で作る、もしくは、ネットから拾ってくる予定です。 なんだよ実装の勉強じゃないのかよ!
それならopencv 平行移動 とかで何ぼでも出てくる気がする
てか回転まで必要なら最初からアフィン変換使えって話になってくるだろうしw
まあ頑張ってー >それならopencv 平行移動 とかで何ぼでも
出てこないです。
>アフィン変換使えって話
平行移動は、Rect処理にします。
void rot(Mat src, Mat &dst, double degree)
{
cv::Point2f center = cv::Point2f(
static_cast<float>(src.cols / 2),
static_cast<float>(src.rows / 2));
double scale = 1.0; // 拡大率
// アフィン変換行列
cv::Mat affine;
cv::getRotationMatrix2D(center, degree, scale).copyTo(affine);
cv::warpAffine(src, dst, affine, src.size(), cv::INTER_CUBIC);
}
回転が、反時計回転になるのが不思議ですね。
あと、degreeはラジアンじゃなくて、シータなんですね。 反時計回転になる原因わかりました。
>GetRotationMatrix2D
>正の値は,反時計回りの回転を意味します
不思議な流儀ですね。
ラップする関数でも、
この流儀に従った方がよいのか、
関数内でマイナスするか、、、
一応、自分の書きたかったことはこれで終了ですが、レスは延々と読み続けます。 >>691
高校で三角関数やらなかった?数学では0度がx軸右方向で反時計回りに回ってって90度がy軸上方向ってのが一般的じゃない?
もちろん、なぜx軸を上方向にとってy軸を右方向にとったり、x軸を右方向にとってy軸を下方向にとらなかったのか?ということを言い出したら「不思議な流儀」になるかもしれないが 滅茶苦茶初歩的な質問で申し訳ないんですが
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
をインクルードしてるのにcv::circle()が無いと言われるのはなぜでしょうか
imshow()やwaitkey()は使えます
OpenCVのバージョンは3.3.0です >>693
エラーメッセージを全部入れてくれないとなんともいいようがないが
インクルードしてるのに関数が見つからない場合は -lopencv_core とか
そんなのを指定し忘れてるとかかなぁ #include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
何するか知らんが、チュートリアルレベルならだいたいこの3つで事足りる。 再生動画(といっても、静止画の配列)のブレ補正処理は、
どういったメソッドでやられてますでしょうか? cv::Matの大きさを変える場合には、
>mt = cv::Mat(height, width, CV_8U).clone();
といった書き方でよいのでしょうか? 大きさを変えるとは?
元画像があって、指定した大きさに拡大・縮小したいという意味? バッファの大きさを変えるだけです。
cv::Mat mt(height, width, CV_8U);
と宣言時に大きさかけますけど、
宣言後にバッファサイズを変える方法が分からなくて。 大きさ変えるってのがうーん
今のデータを残しつつ新しい部分を追加するってこと? mt = cv::Mat(height*2, width, CV_8U); え、
>.clone
要らないんですね。
左辺と右辺でバッファの実態が共有されるのに、
次の行でメモリ解放されないんでしょうか。 新しい変数を使うのじゃダメなの??
既存の変数のサイズを変えないといけない場面が分からないんだけど おまえもだと思うけど、そこまで難しい話しても理解できないでしょ >>702
vector<int> vec(10);
vec = vector<int>(20);
というコードを書いたときに変数とオブジェクトの関係はどうなっているか、というレベルの話なので、C++をまずは勉強したほうがいい。 C++の勉強では、newと書くことになってるでしょ?
いやだから、どうなっているか教えて? >>706
newと書くことが必ずしも必要なわけではない。そして、コピーしたいときに=で済むか、cloneメソッド的なものを呼ばないといけないかは、クラスの作りによる。
続けるとスレチになるし、おそらく現状の理解からvectorの例までを理解するのにはそれなりにやりとりが必要になるような気がするので、詳しくはC/C++初心者スレッドみたいなところで質問してほしい。 つかマジでvectorのサイズ変えるくらいなら新しい変数作ればよくね? >>708
おまえ馬鹿じゃね?
おまえの書いてる時点で、vectorとのメモリ管理が違うことが明確になってるだろ。
それが分からないなんて、知能がたりない。 2chのプログラム関連はそんなもんだろ
それが分からないなんて、知能がたりない 知能がたりないかどうかは、一旦保留にしておいて、、、
vectorのメモリ管理とMatのメモリ管理が明確に違うんだから、
cloneいるかいらないか、の判断の道筋を明確にして欲しいです。
>mt = cv::Mat(height*2, width, CV_8U);
みたいな書き方をvectorでやると、
スコープ抜けると、実態が吹っ飛ぶと思うんですが。
Matは参照カウントか何か細工してますか? ■ このスレッドは過去ログ倉庫に格納されています