アフィリエイト広告を利用しています
ファン
検索
<< 2023年12月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
最新記事
(12/20)KI cad インストールしてみよう
(04/11)【JAVA】チョロメを外部から動作させます。 幽霊が操作してるような
(07/29)spartan3 を cy7c68013 のバルクライトで シリアルコンフィグしてみた
(07/28)ブログ村に参加してみた。いまとのころブログ村からはだれもこない^^;
(07/28)PIC16F1503 を使ってみようかな?? MPLAB 内部クロック
(07/01)からっぽのつぎ のページ きっとはげ に なんか作用するかも
(05/06)GCEでワードプレス 第2 困ったのでやり直し手順
(05/05)https://certbot.eff.org/lets-encrypt/centosrhel7-apache をみてハマったこと
(04/28)フェドラ をつかって switchbot をアクセス する。  ? 未解決
(04/02)【オープンVPN】setsebool -P openvpn_enable_homedirs 1 でうごいた
(04/01)【QT5】わからないのでタイムアウトで自動でキャンセルボタン押すメッセージボックスつくってみた
(03/31)qt5よくわからんのだが メッセージボックスの OKスイッチをタイマーで押してみた。
(03/09)【boost】message queue 使い方 目も目も
(03/08)【バカの一つ覚え】ユニークID作成とそのちょっとした応用
(03/04)【パソコン】【GPIO】いったいこれは?
(02/26)【VHDL入門】ABZ信号から Hsync Vsyncを作り出してみよう その2
(02/26)【VHDL入門】ABZ信号から Hsync Vsyncを作り出してみよう その1
(02/26)【VHDL入門】速度比較 エンコーダーABZ相 ソースファイル付き
(02/25)【VHDL入門】ロータリーエンコーダABZ 出力のサンプル 200Mhz動作?
(02/23)【VHDL入門】UART 送受信繰り返しのテストベンチ作成してみたい
最新コメント
カテゴリーアーカイブ
プロフィール
有象無象さんの画像
有象無象
はげはじめました 禿増されます。励ましのコメントお待ちしてます。  
プロフィール

広告

posted by fanblog

2021年01月05日

linux QTで パソコンで カメラを取得し 写すというところから OPENCVを使いますいつも 工事中

万年初心者の 海蘊です。
だいたい 前にすすまないひとです。 いつものように原理から メモ取りながら 
そして なにかするには馬鹿の一つ覚えですすめます。
 例えば 配置はあれですよ グリッドばっか とか  リソースから画像を読むときは この方法だけとか
作業限定で やります。 むずいテクニックは使いません。

カメラを取り込む前に まずファイルを読んでうごかします。

 

馬鹿の一つ覚え1 リソースから cv::Mat に 画像をいれる

cv::Mat loadFromQtResouce(QString qrc, int flag = cv::IMREAD_COLOR)
{QFile file(qrc);cv::Mat m;
if(file.open(QIODevice::ReadOnly))
{qint64 sz = file.size();std::vector buf(sz);
file.read((char*)buf.data(), sz);
m = cv::imdecode(buf, flag);
}else
{qDebug() << "OpenCV loading time: " ;}
return m;
}

馬鹿の一つ覚え2 画像は UIのフレームの中にいれるということしかしない

馬鹿の一つ覚え3 フレームには グリッドレイアウトしかいれない

つぎのクラスは  GUIで メインUIに置いた フレーム に グリッドレイアウトをおいて 画像を置く
クラスです。

class LoadImg2UIFrameWithSetting_QGridLayoutToFrame
{
public:
LoadImg2UIFrameWithSetting_QGridLayoutToFrame(QFrame *frame ,QWidget *parent=nullptr):parent(parent)
{
m_frame=frame;
m_gridLayout = new QGridLayout(frame);
m_tmpimageWidget=new ImageWidget(parent);
m_gridLayout->addWidget(m_tmpimageWidget);
}
~LoadImg2UIFrameWithSetting_QGridLayoutToFrame()
{
delete m_gridLayout;
delete m_tmpimageWidget;
}
ImageWidget *m_tmpimageWidget;
void setSrc(cv::Mat *src)
{
this->m_src=src;
}
cv::Mat BGR2RGB(cv::Mat m_src)
{
cv::Mat srcRGB;
cv::cvtColor(m_src, srcRGB, cv::COLOR_BGR2RGB);
return srcRGB;
}
cv::Mat *m_src;

void setCanny(cv::Mat matRGBinput )
{
cv::Mat mono,canny_img,m_dst;
cv::cvtColor(matRGBinput, mono, cv::COLOR_BGR2GRAY);
Canny(mono, canny_img, global_param[4], global_param[5],3);
cv::cvtColor(canny_img, m_dst, CV_RGBA2RGB);
QImage tmpimg = QImage(m_dst.data, m_dst.cols, m_dst.rows, static_cast(m_dst.step), QImage::Format_RGB888);
QImage tmpimg21 =tmpimg.copy();
m_tmpimageWidget->setImg(tmpimg21);
QSize size=QSize(m_dst.rows/2,m_dst.cols/2);
m_frame->setMaximumSize(size); m_frame->setMinimumSize(size);
}
void setImg(cv::Mat *matRGBinput ,int select)
{
setImg(* matRGBinput , select);
}
void setImg(cv::Mat matRGBinput ,int select)
{
cv::Mat matRGB=matRGBinput.clone();

int B,G,R;
for(int x=0;x(y, x)[0];
G = matRGB.at(y, x)[1];
B = matRGB.at(y, x)[2];

switch(select)
{
case 0:
R = matRGB.at(y, x)[0]=R;
G = matRGB.at(y, x)[1]=R;
B = matRGB.at(y, x)[2]=R;break;
case 1:
R = matRGB.at(y, x)[0]=G;
G = matRGB.at(y, x)[1]=G;
B = matRGB.at(y, x)[2]=G;break;
case 2:
R = matRGB.at(y, x)[0]=B;
G = matRGB.at(y, x)[1]=B;
B = matRGB.at(y, x)[2]=B;break;
}
}
QImage tmpimg = QImage(matRGB.data, matRGB.cols, matRGB.rows, static_cast(matRGB.step), QImage::Format_RGB888);
QImage tmpimg1 =tmpimg.copy();
m_tmpimageWidget->setImg(tmpimg1);
QSize size=QSize(matRGB.rows/2,matRGB.cols/2);
qDebug()<parent;
m_frame->setMaximumSize(size);m_frame->setMinimumSize(size);

}
private:
QFrame *m_frame;
QGridLayout *m_gridLayout;

QWidget *parent;
};


使い方は 例えば UIで置いた フレームが
ui->frame_myLogo
frame_myLogo_R
frame_myLogo_G
frame_myLogo_B

UIでは フレームとてけとに置きます
frames.png
セレクションされてるのは フレームです 全部で取り敢えず 8つ 置いたよみたいなレベルです。

これに レナちゃんのいれて RGB に分解してそれぞれ表示します。
動作は 鈍いです。

RGBlena.png



setWindowTitle("Test OpenCV");
cv::Mat src = loadFromQtResouce(":/img/Lenna.png");
if(src.empty()) {qDebug() << "Failed to open image file.";Q_ASSERT(0); }

cv::Mat srcRGB;
LoadImg2UIFrameWithSetting_QGridLayoutToFrame *Canny=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_myLogo_Canny ,this);
srcRGB=Canny->BGR2RGB(src);/////////////////とりあえず RGBの順番揃える。
Canny->setCanny(src);
LoadImg2UIFrameWithSetting_QGridLayoutToFrame *RGB=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_myLogo ,this);
RGB->setImg(srcRGB,3);
LoadImg2UIFrameWithSetting_QGridLayoutToFrame *R=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_myLogo_R ,this);
LoadImg2UIFrameWithSetting_QGridLayoutToFrame *G=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_myLogo_G ,this);
LoadImg2UIFrameWithSetting_QGridLayoutToFrame *B=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_myLogo_B ,this);
R->setImg(srcRGB,0);
G->setImg(srcRGB,1);
B->setImg(srcRGB,2);



カメラを取り込みをやってみましょう。


 
馬鹿のひとつおぼえ 4 カメラは スレッドで起動します

カメラを メインで 無限ループさせるのは 辛いので
 しかたなく スレッド起動します。
 
馬鹿のひとつおぼえ 5 スレッドはQスレッド Qobject を 

 Qオブジェクトに プログラムをいれて
  moveToThread  で 起動します。
 なんだかわからないけど これで スレッドが起動します。
 終わる時に 順序よく 消さないといけないので いい方法わかりません。
 とりあえず
CamCaptureObj  でカメラを 取るプログラムのクラスだとします これは後述します。


m_CamCaptureObj = new CamCaptureObj();//// これは カメラキャプチャのクラスですが これを つくって
m_thread = new QThread(this);///////// スレッド をつくって
m_CamCaptureObj->moveToThread(m_thread);//// スレッドを移動します。 あとでスタートします。

connect(m_thread , SIGNAL(started()) , m_CamCaptureObj , SLOT(process()));////// スレッドをスタートしたら プロセスというサブルーチンを呼びます。
connect(m_CamCaptureObj , SIGNAL(frameUpdateed()) , this , SLOT(on_frameUpdateed()));// 画像が更新されたら  という信号をとります。

connect(m_CamCaptureObj , SIGNAL(processEnd()) , m_thread , SLOT(quit())); /// キャプチャーが終了したら スレッドは 停止させる
connect(m_thread , SIGNAL(finished()) , m_thread , SLOT(deleteLater()));///スレッドが終了したら スレッドを消す
connect(m_CamCaptureObj , SIGNAL(processEnd()) , m_CamCaptureObj , SLOT(deleteLater()));///スレッドが終了したら オブジェクトを消す


frameRGB=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_ORG,this);///これは UIのフレームにレアうと置いて というクラス
frameR=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_R,this);
frameG=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_G,this);
frameB=new LoadImg2UIFrameWithSetting_QGridLayoutToFrame(ui->frame_B,this);

QImage t0=QImage(":/img/Lenna.png");//動作の最初のテストデ レイナ ねーちゃんを ロード
QImage t1=QImage(":/img/Lenna.png");//動作の最初のテストデ レイナ ねーちゃんを ロード
QImage t2=QImage(":/img/Lenna.png");//動作の最初のテストデ レイナ ねーちゃんを ロード
QImage t3=QImage(":/img/Lenna.png");//動作の最初のテストデ レイナ ねーちゃんを ロード

this->frameR->m_tmpimageWidget->setImg(t0);//動作の最初のテストデ それぞれ配置
frameG->m_tmpimageWidget->setImg(t1);//動作の最初のテストデ それぞれ配置
frameB->m_tmpimageWidget->setImg(t2);//動作の最初のテストデ それぞれ配置
frameRGB->m_tmpimageWidget->setImg(t3);//動作の最初のテストデ それぞれ配置


m_thread->start(); ////////////////////////////起動すると レイナネーちゃんはかき消されます



void MainWindow:: closeEvent(QCloseEvent * event)
{
m_CamCaptureObj->quit();///// クローズでキャプチャは停止させましょう。
QSettings setting("setting.ini", QSettings::IniFormat);// これも馬鹿のひとつおぼえ ウィンドウの形状をおぼえる
setting.setValue("geometry", saveGeometry());
setting.setValue("windowState", saveState());
QMainWindow::closeEvent(event);
}


void MainWindow::readSettings()///起動時に  サイズとか もどします。
{
QSettings setting("setting.ini", QSettings::IniFormat);
restoreGeometry(setting.value("geometry").toByteArray());
restoreState(setting.value("windowState").toByteArray());
}


MainWindow::~MainWindow()
{
qDebug()<<" m_thread->exit()";///////////ウインドウが本当に終了するとき スレッドをぬけましょう
m_thread->exit();
qDebug()<<" m_thread->wait()";
m_thread->wait();////////スレッドが消えるまでは我慢する。 こと
qDebug()<<"delete ui";
delete ui;
}

さて ここまでの起動してみましょう  キャプチャのクラスは もっと後述です 
 まずは 入れ物がこんな調子 


 ビデオのキャプチャスレッドが 画像を取り込むたびによばれます。
 とりあえず 1個だけアップデートします・
  だらしないですが m_frame はばプリックで 色をBGRから RGBに入れ替えて表示です。
void MainWindow::on_frameUpdateed()
{
cv::Mat tmp=frameRGB->BGR2RGB(m_CamCaptureObj->m_frame);
frameRGB->setImg(tmp,4);////RGB に色を変更して 
}

ふむふむ カメラが パジャマの 毛をうつしてる。 という話し
kamera.png



おはずかしいプログラムで まだバグだらけ でも
 cameracaptureobjは
 ヘッダ^はご想像あれ。 オブジェクトでつくってる。
 あと 細線化とか ループにいれている。
 本体が クローズしたら quit がよばれて ループが終了するようにしている。
 終了すると  最後に WINDOWのデストラクタで きえる。

LoadImg2UIFrameWithSetting_QGridLayoutToFrame で作られたインスタンスは 
きちんとデリートしましょう。 それいまほったらかし




こんな感じ
#include "camcaptureobj.h"
#include
extern int global_param[];


CamCaptureObj::CamCaptureObj(QObject *parent) : QObject(parent)
{

}

void CamCaptureObj::process()
{
qDebug()<<"doWork";
m_flgRunning=true;

VideoCapture cap;
cap.open(0);

if (!cap.isOpened())
{
qDebug() << "Can not open video stream: '";
return ;
}

Mat mono;

vector circles;

cv::Mat frame; //取得したフレーム
Detector detector;
cv::Mat calcframe;

cv::Mat canny_img;
int width=0;
int height=0;
while((cap.read(frame))&&(m_flgRunning==true))//無限ループ
{
cap >> frame;if (frame.empty()){cout << "Finished reading: empty frame" << endl;break;}
if(width!=frame.cols){width=frame.cols;framesizeUpdateed(width,height);}
if(height!=frame.rows){height=frame.rows;framesizeUpdateed(width,height);}

int64 t = getTickCount();
vector found = detector.detect(frame);
t = getTickCount() - t;


cvtColor( frame, mono, CV_BGR2GRAY );
Canny(mono, canny_img, global_param[4], global_param[5],3);
cv::HoughCircles(
canny_img, // 8ビット,シングルチャンネル,グレースケールの入力画像
circles, // 検出された円を出力.配列の [ 0, 1 ] に円の中心座標. [2] に円の半径が格納される
cv::HOUGH_GRADIENT, // cv::HOUGH_GRADIENT メソッドのみ実装されている.
global_param[0], // 画像分解能に対する出力解像度の比率の逆数
global_param[1], // 検出される円の中心同士の最小距離
global_param[2], // Canny() の大きいほうの閾値.勾配がこのパラメータを超えている場合はエッジとして判定
global_param[3] // Canny() の小さいほうの閾値.勾配がこのパラメータを下回っている場合は非エッジとして判定
);

m_Qcannyimg = QImage(canny_img.data, canny_img.cols, canny_img.rows, static_cast(canny_img.step), QImage::Format_Grayscale8);
cvtColor( canny_img, mono, CV_GRAY2RGB );
for( size_t i = 0; i < circles.size(); i++ )
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][4]));
int radius = cvRound(circles[i][5]);
//qDebug()<0)&&(radius<400)){

circle( mono, center, 3, Scalar(255,255,0), -1, 8, 0 );
circle( mono, center, radius, Scalar(0,255,0), 3, 8, 0 );
}
}

{
ostringstream buf;
buf << "Mode: " << detector.modeName() << " ||| "
<< "FPS: " << fixed << setprecision(1) << (getTickFrequency() / (double)t);
putText(frame, buf.str(), Point(10, 30), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 255), 2, LINE_AA);
}
for (vector::iterator i = found.begin(); i != found.end(); ++i)
{
Rect &r = *i;
detector.adjustRect(r);
rectangle(frame, r.tl(), r.br(), cv::Scalar(0, 255, 0), 2);
}
cv::cvtColor(mono, m_dist, CV_BGR2RGB); // OpenCVの命令でRGBの順番を入れ替えて、m_dstに保存
m_frame=frame.clone();
emit frameUpdateed();
}
qDebug()<<"processEnd";
emit processEnd();

};
void CamCaptureObj::quit()
{
qDebug()<<"quit";
m_flgRunning=false;
};
























 

この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/10451010
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
×

この広告は30日以上新しい記事の更新がないブログに表示されております。