質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

4637閲覧

OpenCV,IPPライブラリを用いた画像処理(回転)について

nim

総合スコア7

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/08 05:34

###前提・実現したいこと
初めてこのサイトを利用させていただきます。

現在、C++ソースコード上にて、下記関数を実装しています。
cv::Mat*型の引数「dstM」を、この関数内でIPPライブラリで使用できる型にキャストして使用しています。
「dstM」にロードされている画像データを、画像中心周りに「argdRot」回転させ、
「dstM」自身に再格納しようと考えています。
何かしらの変換処理は掛かっているのですが、期待したものとは大きく異なっております。
(※元画像、処理画像ともに公開が難しいため、添付することができません。)

OpenCVのリファレンスやサンプルコードは多く存在しているのですが、IPPに関しては、
下記リンクくらいしか有用そうなものを見つけることができず、事故解決が困難なために投稿しました。

※提示した情報に不足があれば、ご指摘お願い致します。

###該当のソースコード

void mf_rotation(const double argdRot, cv::Mat* dstM) { Ipp32f *ipp_dstM = (Ipp32f*)dstM->data; IppiRect dstROI = {0, 0, dstM->cols, dstM->rows}; IppiSize dstROISize = {dstM->cols, dstM->rows}; double xShift = 0; double yShift = 0; ippiGetRotateShift((double(dstM->cols) / 2.0), (double(dstM->rows) / 2.0), argdRot, &xShift, &yShift); ippiRotate_32f_C1R(ipp_dstM, dstROISize, (int)dstM->step, dstROI, ipp_dstM, (int)dstM->step, dstROI, argdRot, xShift, yShift, IPPI_INTER_CUBIC); }

###関連リンク
■ IPPリファレンスマニュアル
http://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IPP_2_Final_i.pdf

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2016/11/08 05:46

なにが/どのように期待したものとは大きく異なってるか示してくれんと解決が遠のくだけだから、レナさんみたいなフリー素材で試せばいいじゃん。
guest

回答4

0

こんにちは。

argdRotの単位はdegree(度)を指定することになってますが、ラジアンで与えているということはないですよね?
dstMは1チャンネルのfloat画像ですね? 画素の並び型等の指定を間違うと画像がぐちゃぐちゃになります。

argdRot, xShift, yShiftを全部0にしてippiRotate_32f_C1Rを呼び出してみるのも1つと思います。
全く画像は変化しないはずです。
もし変化しているようでしたら、表示して確認する際の画像フォーマット変換にミスしていない等も疑った方がよいと思います。
変化していないなら、xShiftだけ非0値を入れてどうなるかみるなど、1つずつ進めると問題が見つかることが多いです。

(※元画像、処理画像ともに公開が難しいため、添付することができません。)

公開が難しい元画像ではなくて、例えばこの画面のキャプチャ画像等で公開されてはどうでしょうか?
プログラムのソースを出してますから公開可能な元画像を使う分には問題ないように感じます。

投稿2016/11/08 06:22

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

確認ですけど、ピクセルは32bit-floatひとつで構成されてるんですね?
8bit-char×3channel(or 4channel)じゃないんですね?

それと dstM->step は妥当な値(幅x4)になってますね?

投稿2016/11/08 06:14

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

画像の中心を中心にして回転ならば素直にアフィン変換で回転で良いのでは?
Rotating an Image Using Intel IPP Warp Functions
IPPでもアフィンのサンプル公開しているし

投稿2016/11/08 06:09

編集2016/11/08 06:11
MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

epistemeさん、MasahikoHirataさん、Chironianさん、ありがとうございます。

下記コードにて自己解決しましたが、
致命的な二点、
・ピクセルを再確認したところ、1channel,16bit-unsigndshortだったこと
・「argdRot」の単位がradだったこと
その他一点、
・拡張性も考慮して、アフィン変換を用いたコードに書き換えたこと
の修正は、皆様のアドバイスがあってのものでした。

※アフィン行列を一行で求めることができる関数を見つけられなかったため、自力で求めています……。
(多分より最適化できるでしょうが、とりあえず動いたのでご報告に上がりました。)

今回は、質問の仕方も悪かったと反省しております。
初投稿でしたので、次回から生かしたいと思います。

また、皆様のアドバイスはいずれも参考にさせていただいたので、
早さ順でepistemeさんをベストアンサーとさせていただきました。
ご了承ください。

それでは、ありがとうございました。

void rotation(const double argdRot, cv::Mat* dstM) { cv::Mat tmpM = cv::Mat::zeros(dstM->rows, dstM->cols, CV_16U); Ipp16u *ipp_tmpM = (Ipp16u*)tmpM.data; Ipp16u *ipp_dstM = (Ipp16u*)dstM->data; IppiRect dstROI = {0, 0, dstM->cols, dstM->rows}; IppiSize dstROISize = {dstM->cols, dstM->rows}; double rad = argdRot * IPP_PI / 180.0; double alpha = qCos(rad); double beta = qSin(rad); double centerX = double(dstM->cols) / 2.0; double centerY = double(dstM->rows) / 2.0; double affineMat[2][3] = {{alpha, beta, 0}, {-beta, alpha, 0}}; double bound[2][2]; ippiGetAffineBound(dstROI, bound, affineMat); double centerx = (bound[0][0] + bound[1][0]) / 2.0; double centery = (bound[0][1] + bound[1][1]) / 2.0; affineMat[0][2] += centerX - centerx; affineMat[1][2] += centerY - centery; ippiWarpAffine_16u_C1R(ipp_dstM, dstROISize, (int)dstM->step, dstROI, ipp_tmpM, (int)dstM->step, dstROI, affineMat, IPPI_INTER_CUBIC); tmpM.copyTo(*dstM); }

投稿2016/11/08 13:38

編集2016/11/09 01:38
nim

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2016/11/09 23:50

16bitモノクロつーと医療X線画像の類かしらね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問