OpenCVとcvBlobsLibを使用して通常のblobトラッカーを作成しているときに、この問題に遭遇しましたが、他の誰もそれを持っていなかったようで、それは私を悲しくさせます。RGB / BGRフレームを取得し、分離する色を選択し、それを白黒にしきい値設定し、ブロブを見つけて、各ブロブに境界矩形を追加しますが、最終的な画像を表示すると、ボックスはx軸上に引き伸ばされます:オブジェクトが左側にある場合、ボックスはその近くにあり(ただし、約2.5倍大きい)、右に移動すると、ボックスは、の右端に到達するまで、より速く(=オブジェクトからますます遠くに)移動します。オブジェクトが途中にないときのウィンドウ。これは、すべてが正常であるy軸では発生しません。長方形の場合は問題ありません。fillBlobを使用した場合にも発生します。blobの形状が引き伸ばされてずれて表示されます。また、それは kinect(OpenNI)、Webカメラ、さらには単一の画像(imread())を使用してみたので、画像のキャプチャに関連する問題ではありません。使用したすべてのImageGenerator、Mat、IplImageが640x480、8ビットの深さであることを確認しました。私はnamedWindowにAUTOSIZEを使用しました(フルスクリーンウィンドウに拡大しても役に立ちません)。BGRフレームとしきい値画像を表示しても問題はなく、どちらもウィンドウに収まりますが、元の画像とマージすると、検出されたブロブは異なる解像度の空間に属しているように見えます。これがコードです。どこでもオンラインで見られる通常の例からあまり変わっていません。私はnamedWindowにAUTOSIZEを使用しました(フルスクリーンウィンドウに拡大しても役に立ちません)。BGRフレームとしきい値画像を表示しても問題はなく、どちらもウィンドウに収まりますが、元の画像とマージすると、検出されたブロブは異なる解像度の空間に属しているように見えます。これがコードです。どこでもオンラインで見られる通常の例からあまり変わっていません。私はnamedWindowにAUTOSIZEを使用しました(フルスクリーンウィンドウに拡大しても役に立ちません)。BGRフレームとしきい値画像を表示しても問題はなく、どちらもウィンドウに収まりますが、元の画像とマージすると、検出されたブロブは異なる解像度の空間に属しているように見えます。これがコードです。どこでもオンラインで見られる通常の例からあまり変わっていません。
//[...]
namedWindow("Color Image", CV_WINDOW_AUTOSIZE);
namedWindow("Color Tracking", CV_WINDOW_AUTOSIZE);
//[...] I already got the two cv::Mat I need, imgBGR and imgTresh
CBlobResult blobs;
CBlob *currentBlob;
Point pt1, pt2;
Rect rect;
//had to do Mat to IplImage conversion, since cvBlobsLib doesn't like mats
IplImage iplTresh = imgTresh;
IplImage iplBGR = imgBGR;
blobs = CBlobResult(&iplTresh, NULL, 0);
blobs.Filter(blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 100);
int nBlobs = blobs.GetNumBlobs();
for (int i = 0; i < nBlobs; i++)
{
currentBlob = blobs.GetBlob(i);
rect = currentBlob->GetBoundingBox();
pt1.x = rect.x;
pt1.y = rect.y;
pt2.x = rect.x + rect.width;
pt2.y = rect.y + rect.height;
cvRectangle(&iplBGR, pt1, pt2, cvScalar(255, 255, 255, 0), 3, 8, 0);
}
//[...]
imshow("Color Image", imgBGR);
imshow("Color Tracking", imgTresh);
「[...]」はこの問題とは関係のないコードですが、画像の処理方法についてさらに情報が必要な場合は、お知らせください。投稿します。
画像のキャプチャ方法は何も変わらず、BGRフレームと白黒画像がよく表示され、ブロブを取得した後、それらを表示する方法で同じ(間違った)結果が得られるという事実に基づいて、問題はCBlobResult()とmatrix2ipl変換の間の何かですが、それを見つける方法が本当にわかりません。