-2

私はOpenCVで少し問題に悩まされています。

ROIを描画するために、Webカメラのキャプチャに長方形を描画することができます。フレームのこの部分をグレースケールできるかどうか知りたいのですが。

私はそれを行うために多くの異なる方法を試しましたが、それでも私はそれを行うことができません。

助言がありますか?

4

3 に答える 3

0

これが例です

cv::Mat image, roi_image;
image = cv::imread("example.jpg");  
cv::Rect r = cv::Rect(10,10, 50,50); // 'r' defines the location of ROI
roi_image = image(r);                // select ROI 
cvtColor(roi_image, roi_image, CV_RGB2GRAY);  //modify ROI
imshow("Ouput", image);   // desired output image where ROI is in grayscale
cv::waitKey(10);         // add this line so that graphics can update

roi_imageのROIを指している行列であることに注意してくださいimage。roi_imageを変更すると、も変更されimageます。

于 2013-03-21T02:53:10.777 に答える
0

あなたの時間と忍耐の人に感謝します。O'reillyの「LearningopenCV」の本を読んでいます。すべての例は、MatクラスではなくIplImageクラスを使用して行われます。実は、何が違うのかすらわかりません。

とにかく、Matオブジェクトを使用していないため、ソリューションを使用できませんでした。これが私のソリューションです(現在は機能しています):

while(1)
{
 frame = cvQueryFrame(cam);
 temp = cvCloneImage(frame);
 if(!frame)break;
 cvCopy(frame,temp);
 if(drawing_box || box_drew)
  draw_box(temp,box);

 if(grayScaleOn && box_drew)
 {
  for(int y=box.y;y<box.y+box.height;y++)
  {
    uchar* ptr = (uchar*)(temp->imageData+y*temp->widthStep);
    for(int x=box.x;x<box.x+box.width;x++)
    {
ptr[3*x+0] = ptr[0] * 0.114 + ptr[3*x+1]*0.587 + ptr[3*x+2]*0.299;
ptr[3*x+1] = ptr[0] * 0.114 + ptr[3*x+1]*0.587 + ptr[3*x+2]*0.299;
ptr[3*x+2] = ptr[0] * 0.114 + ptr[3*x+1]*0.587 + ptr[3*x+2]*0.299;
    }
  }
 cvShowImage("Output", temp);
于 2013-03-21T15:02:14.440 に答える
0

キャプチャした画像のROIをグレースケールに設定する大まかな方法​​は次のとおりです。

cv::VideoCapture capture;
cv::Mat frame, grayFrame, gray3;

if(!capture.open(-1))
{
    cout<<"Capture Not Opened"<<endl; return;
}

int width = capture.get(CV_CAP_PROP_FRAME_WIDTH);
int height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);

cv::Rect roi(20,20,400,400); //The ROI to convert to gray

cv::Mat mask = cv::Mat::zeros(height,width,CV_8U);
for(int i = roi.y; i<roi.y + roi.height - 1; i++)
    for(int j= roi.x; j<roi.x + roi.width - 1; j++)
        mask.at<uchar>(i,j) = 1;

do 
{
    capture>>frame;

    if(frame.empty()) break;

    cv::cvtColor(frame,grayFrame,cv::COLOR_BGR2GRAY);

    cv::cvtColor(grayFrame, gray3, cv::COLOR_GRAY2BGR);

    frame.setTo(cv::Scalar::all(0),mask);
    cv::add(frame,gray3,frame,mask);

    cv::imshow("Image",frame);
    cv::waitKey(10);
} 
while (true);

マスクされた操作を使用して画像値を設定する簡単な方法を見つけることができなかったので、別の方法はROIをゼロに設定し、それにマスクされた値を追加することです。

于 2013-03-21T05:30:29.483 に答える