我遇到了OpenCV的一个小问题。
我可以在网络摄像头的捕捉上绘制一个矩形,以获得投资回报率。我想知道是否可以对帧的这一部分进行灰度化。
我尝试了许多不同的方法,但我仍然无法做到。
有什么建议吗?
答案 0 :(得分: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
是一个指向image
投资回报率的矩阵。如果修改roi_image,它也会修改image
。
答案 1 :(得分: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设置为零,并将屏蔽值添加到其中。
答案 2 :(得分:0)
感谢您的时间和耐心。 我正在阅读O'reilly的“学习openCV”一书,所有的例子都是用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);