我使用Qt创建了一个简单的图形用户界面,我使用OpenCV对网络摄像头进行处理,即精确边缘检测。
我尝试在两个网络摄像头显示器之间实现切换:
1 *)“普通模式”:灰度显示,其中网络摄像头为边框检测视频提供灰度颜色
2 *)“greenMode”:绿色和黑色显示屏,网络摄像头提供相同的“检测到边框”,但带有绿色和黑色。
第一个工作(灰度)工作。结果如下:
现在我遇到了第二个问题。这是我无法找到解决方案的代码部分:
// Init capture
capture = cvCaptureFromCAM(0);
first_image = cvQueryFrame( capture );
// Init current qimage
current_qimage = QImage(QSize(first_image->width,first_image->height),QImage::Format_RGB32);
IplImage* frame = cvQueryFrame(capture);
int w = frame->width;
int h = frame->height;
if (greenMode) // greenMode : black and green result
{
current_image = cvCreateImage(cvGetSize(frame),8,3);
cvCvtColor(frame,current_image,CV_BGR2RGB);
for(int j = 0; j < h; j++)
{
for(int i = 0; i < w; i++)
{
current_qimage.setPixel(i,j,qRgb(current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1]));
}
}
}
else // normal Mode : grayscale result WHICH WORKS
{
current_image = cvCreateImage(cvGetSize(frame),8,1);
cvCvtColor(frame,current_image,CV_BGR2GRAY);
for(int j = 0; j < h; j++)
{
for(int i = 0; i < w; i++)
{
current_qimage.setPixel(i,j,qRgb(current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1]));
}
}
}
gaussianfilter(webcam_off);
border_detect(webcam_off);
cvReleaseImage(¤t_image);
repaint();
“greenMode”似乎没有使用此“setPixel
”(我采用中间rgb值:current_image->imageData[i+j*w+1]
)放置好的像素:
current_image = cvCreateImage(cvGetSize(frame),8,3);
cvCvtColor(frame,current_image,CV_BGR2RGB);
for(int j = 0; j < h; j++)
{
for(int i = 0; i < w; i++)
{
current_qimage.setPixel(i,j,qRgb(current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1]));
}
}
这是我得到的:
首先,输出不是绿色和黑色;其次,与灰度图像相比,它会变焦。
你有没有获得绿色模式的线索?
答案 0 :(得分:0)
qRgb(current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1],current_image->imageData[i+j*w+1])
您对所有三种RGB颜色分量使用相同的值。 R == G == B将始终导致灰色。
要将RGB值转换为绿色/黑色,您可以转换为灰度(使用发光度方法),然后将其着色为绿色:
const int v = qRound( 0.21 * pixel.red() + 0.71 * pixel.green() + 0.07 * pixel.blue() );
setPixel( i, j, qRgb( v, 0, 0 ) );
(可能有更复杂的着色方法)。
对于缩放,我假设在计算current_image的索引时发生错误。你对两个图像使用相同的(i + j * w + 1),但灰色有1个通道,第二个3(第三个cvCreateImage参数)。所以后者每个像素会有两个以上的值。