1

画像から特定の座標の幅と高さの長方形を作成したいと思います。

次に、チャネルを分割し、最後にこの領域の特定のチャネルをしきい値処理します。

私の問題は、画像上の領域(長方形)を参照したいということです。

これは私のコードです:cv :: Rect myROI(10、20、50、50);
cv :: Mat CroppedImage = org_image(myROI);

このcroppedImageを操作した後、操作がorg_imageに影響を与えることも必要です。

エリアをコピーするのではなく、そのエリアを参照したい(参照する)。

どうやってやるの?


編集1:

まずはご回答ありがとうございます。
cv :: threshold(croppedImage、croppedImage、thresh、255、type);を使用する場合、上記のコードに加えて小さなソリューションが必要です。

長方形の領域はしきい値処理されますが(すべてのチャネル)、必要な特定のチャネルではありません。たとえば、青いチャネルのみをしきい値処理したいのですが、すべてを試しましたが、機能しません。

長方形を分割しようとしましたが、機能しません。

ちなみに、分割された画像をマージするソリューションもありますか?これは私を助けることができます私がcroppedImageを参照するだけで分割できれば、それは私の問題を解決すると思います。

したがって、ROIの1つのチャネルをしきい値設定するだけで済みます。完全な解決策を教えてください。そして、私は分割を使用する必要があります。

ありがとうございました


編集2

したがって、機能しません。ここにある私のコードを参照してください...分割されたチャネルでの操作は、トリミングされた画像とそれぞれ元の画像にも影響を与えません。

  Mat org_image = image.clone();
  cv::Rect myROI(0, 0, 5, 5);
  cv::Mat croppedImage = org_image(myROI);
  std::vector<cv::Mat> img_split(3);
  split(croppedImage, img_split);

  cv::threshold(img_split[1], img_split[1], thresh, 255, 0);

  for(int i=0; i < 3; i++)
  printf("img_split[%d].data[0] ==> adress: %p, ==> data: %d\n", i, &img_split[i].data[0], img_split[i].data[0]);
  printf("+++++++++++++++++\n");        
  for(int i=0; i < 3; i++)
  printf("     croppedImage[%d] ==> adress: %p, ==> data: %d\n", i, &croppedImage.data[i], croppedImage.data[i]);      
  printf("+++++++++++++++++\n");    
  for(int i=0; i < 3; i++)
  printf("org_image[%d] ==> adress: %p, data ->  %d\n", i, &org_image.data[i], org_image.data[i]);

出力:

img_split[0].data[0] ==> adress: 0x846e8a0, ==> data: 212
img_split[1].data[0] ==> adress: 0x846e8d0, ==> data: 255
img_split[2].data[0] ==> adress: 0x846e910, ==> data: 220
+++++++++++++++++
     croppedImage[0] ==> adress: 0xb468d010, ==> data: 212
     croppedImage[1] ==> adress: 0xb468d011, ==> data: 220
     croppedImage[2] ==> adress: 0xb468d012, ==> data: 220
+++++++++++++++++
org_image[0] ==> adress: 0xb468d010, data ->  212
org_image[1] ==> adress: 0xb468d011, data ->  220
org_image[2] ==> adress: 0xb468d012, data ->  220

これ以上のアイデアはありません....:-(

4

1 に答える 1

1

実際、このcroppedImageを操作すると、その操作はorg_imageに影響します。これには特別なコンストラクターを使用できます。

Mat::Mat(const Mat& m, const Rect& roi)

次に例を示します。

uchar vals[] = {1,1,1,1,
                1,1,1,1,
                1,1,1,1,
                1,1,1,1};
cv::Mat_<uchar> A(4,4,vals);
std::cout << "before:\n" << A << std::endl;

cv::Rect roi(1,1,2,2);
cv::Mat_<uchar> B( A, roi );
B.setTo(2);

std::cout << "after:\n" << A << std::endl;

出力:

before:
 [1, 1, 1, 1;
  1, 1, 1, 1;
  1, 1, 1, 1;
  1, 1, 1, 1]
after:
 [1, 1, 1, 1;
  1, 2, 2, 1;
  1, 2, 2, 1;
  1, 1, 1, 1]
于 2013-03-12T21:42:39.127 に答える