2

こんにちは、グレースケール画像を高速にスケーリングする必要があるため、vImage を試しましたが、アプリがクラッシュしました。助けてください。以下のコードでは、srcimg.data/dstimg.data は unsigned char 画像データ (単一チャネルのみのグレー データ) へのポイントです。

                    vImage_Buffer src;
                    src.data=srcimg.data;
                    src.height=srcimg.cols;
                    src.width=srcimg.rows;
                    src.rowBytes=srcimg.cols;

                    vImage_Buffer dest;
                    dest.data=dstimg.data;
                    dest.height=dstimg.cols;
                    dest.width=dstimg.rows;
                    dest.rowBytes=dstimg.cols;
                    vImageScale_Planar8(&src, &dest, NULL, kvImageNoFlags);

4

3 に答える 3

2

vImage/Geometry.h のリサンプリング API では、速度よりも品質を向上させるためにベクトル ユニットを使用することにしました。これは、通常、ベクトル ユニットがメモリ内で分散アクセスを行うのがかなり苦手なためです。これは主に、非ユニット ストライドを使用した線形または最近傍のリサンプリングのような単純なものに対して行っていることです。それらは、最近傍または線形フィルタリングを高速化するのが得意であるとは思えませんでした。そのため、代わりにランチョス フィルタリングを使用しました。これは、隣接するピクセルのより大きな領域を調べて、各結果のピクセルを計算します。それはすばらしく見えますが(私はそう思います)、その素晴らしさを得るにはもっと多くの作業が必要です.

また、線形または最近傍フィルタリングだけが必要な場合は、GPU にそのためのハードウェアがあります。

確かに、vImage の一般的な API は、自分で作成するよりも高速に結果を提供することを目的としています。

于 2012-10-03T00:22:58.990 に答える
1

cv::resizeデフォルトでは線形補間を使用します。 vImageScale_Planar8は、より複雑なLanczos リサンプリングを使用しますが、品質も大幅に向上します。あなたはリンゴとオレンジを比較しています。

于 2012-07-25T16:22:24.310 に答える
0

まず、コメントです。通常、高さは行、幅は列になります。使用方法が奇妙に思えます。

宛先イメージのメモリを malloc しましたか:

dstimg.data = malloc(dstimg.cols * dstimg.rows);

展開ターゲットを ios5 以降に設定していますか?

iOS5 で問題なく Accelerate フレームワークを使用しました。

于 2012-07-24T11:49:41.623 に答える