2021年01月05日
linux QTで パソコンで カメラを取得し 写すというところから OPENCVを使いますいつも 工事中
万年初心者の 海蘊です。
だいたい 前にすすまないひとです。 いつものように原理から メモ取りながら
そして なにかするには馬鹿の一つ覚えですすめます。
例えば 配置はあれですよ グリッドばっか とか リソースから画像を読むときは この方法だけとか
作業限定で やります。 むずいテクニックは使いません。
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;
}
つぎのクラスは 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では フレームとてけとに置きます
セレクションされてるのは フレームです 全部で取り敢えず 8つ 置いたよみたいなレベルです。
これに レナちゃんのいれて RGB に分解してそれぞれ表示します。
動作は 鈍いです。
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);
カメラを メインで 無限ループさせるのは 辛いので
しかたなく スレッド起動します。
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);
}
だいたい 前にすすまないひとです。 いつものように原理から メモ取りながら
そして なにかするには馬鹿の一つ覚えですすめます。
例えば 配置はあれですよ グリッドばっか とか リソースから画像を読むときは この方法だけとか
作業限定で やります。 むずいテクニックは使いません。
カメラを取り込む前に まずファイルを読んでうごかします。
馬鹿の一つ覚え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
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
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
G = matRGB.at
B = matRGB.at
switch(select)
{
case 0:
R = matRGB.at
G = matRGB.at
B = matRGB.at
case 1:
R = matRGB.at
G = matRGB.at
B = matRGB.at
case 2:
R = matRGB.at
G = matRGB.at
B = matRGB.at
}
}
QImage tmpimg = QImage(matRGB.data, matRGB.cols, matRGB.rows, static_cast
QImage tmpimg1 =tmpimg.copy();
m_tmpimageWidget->setImg(tmpimg1);
QSize size=QSize(matRGB.rows/2,matRGB.cols/2);
qDebug()<
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では フレームとてけとに置きます
セレクションされてるのは フレームです 全部で取り敢えず 8つ 置いたよみたいなレベルです。
これに レナちゃんのいれて RGB に分解してそれぞれ表示します。
動作は 鈍いです。
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 に色を変更して
}
ふむふむ カメラが パジャマの 毛をうつしてる。 という話し
おはずかしいプログラムで まだバグだらけ でも
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;
};
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
-
-
no image
-
-
no image
-
-
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
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 に色を変更して
}
ふむふむ カメラが パジャマの 毛をうつしてる。 という話し
おはずかしいプログラムで まだバグだらけ でも
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
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
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
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()<
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
{
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;
};
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/10451010
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック