Оттенки серого ROI изображения BGR

Я застрял с небольшой проблемой с OpenCV.

Я могу нарисовать прямоугольник на захвате моей веб-камеры, чтобы нарисовать ROI. Я хотел бы знать, если это возможно, в оттенках серого эту часть кадра.

Я пробовал много разных способов сделать это, но я все еще не могу сделать это.

Какие-либо предложения?

-2

Решение

Вот пример

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,

0

Другие решения

Спасибо за ваше время и терпение, ребята.
Я читаю книгу «Изучение openCV» от O’reilly, и все примеры сделаны с классом IplImage вместо класса Mat. На самом деле, я даже не знаю, в чем разница.

В любом случае, я не смог использовать ваше решение, так как я не использую какой-либо объект 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);
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 на ноль и добавление к нему маскированных значений.

0
По вопросам рекламы [email protected]