1

次のような OpenCV の簡単な例を試してみたかったのです。

Mat greyMat;
cvtColor(image, greyMat, CV_BGR2GRAY);
filtered_image = [self UIImageFromCVMat:greyMat];
[color_filtered_view setImage:filtered_image];

ここで、image は別のマット (カメラから取得) であり、ボタンが押された場合に実行されます。

残念ながら、絶対に何も起こりません。画像ビューは空白のままです。

setNeedsLayout と setNeedsDisplay は役に立ちませんが、デバイスを回転させると (そしてレイアウトを強制的に他の向きに合わせると)、画像が突然表示されます。

どうしたの?

アップデート:

この問題が発生するのは、CvVideoCamera が別のビューにストリーミングされているためであり、Mat から UIImage への変換が原因ではないことがわかりました。問題は、これ (実行中の CvVideoCamera) が setImage をブロックする理由/方法です。

4

2 に答える 2

1

今日、私は同じ問題を抱えていました.setImage呼び出しが別のスレッドから呼び出されているという事実に関連していると思います。このコードは私のために働きます:

dispatch_sync(dispatch_get_main_queue(), ^{
   [color_filtered_view setImage:filtered_image];
});

幸運を!

于 2013-07-11T21:33:35.673 に答える
0

コードの問題は、src 画像をコピーすることで、画像全体を切り取った画像にコピーすることです。次の 2 つの可能性があります。

1 - データをコピーしない。あなたがしたのと同じです。しかし、2番目のステップはありません。その場合、croppedImage は実際のコピーではなく、src に割り当てられたデータを指していました。

 cv::Mat croppedImage = src(myRoi);

2 - データのコピーあり。

 cv::Mat croppedImage;
 cv::Mat(src, myRoi).copyTo(croppedImage)

理解を深めるために、このopenCVリンクを使用してください。
私はそれがあなたのために働くことを願っています.

于 2013-05-23T14:05:06.707 に答える