gpt4 book ai didi

c++ - 使用 OpenCV 检测视频中的特定(定性)颜色

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:44 31 4
gpt4 key购买 nike

所以:我有这个 OpenCV 程序,它从相机捕获视频,并将其显示在两个窗口上。一个没有颜色检测;另一个突出显示某些特定颜色(例如红色)。

我需要的是一种方法来确定图像在特定时间是否包含该特定颜色。现在,第一个窗口只是一个普通的视频输出。第二个窗口全黑,直到看到与我指定的颜色匹配的对象,这使得该对象在第二个窗口中显示为白色。

我想知道它何时被检测到,然后输出“检测到”或“未检测到”。

我该怎么做?我想我会遍历修改后的图像的宽度和高度,然后检查,但我不知道该怎么做。任何帮助表示赞赏 - 几天来我一直在努力寻找这个问题的答案但没有运气。我检查了 StackOverflow,但它没有提供我需要的东西。谢谢!

代码:

#include <opencv/cv.h>
#include <opencv/highgui.h>

//This function threshold the HSV image and create a binary image
IplImage* GetThresholdedImage(IplImage* imgHSV){
IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);
IplImage* imgThresh2=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);
IplImage* imgThresh3=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);
cvInRangeS(imgHSV, cvScalar(170,160,60), cvScalar(180,256,256), imgThresh2);
cvInRangeS(imgHSV, cvScalar(0,160,60), cvScalar(22,256,256), imgThresh3);
cvOr(imgThresh2, imgThresh3, imgThresh);
cvInRangeS(imgHSV, cvScalar(75,160,60), cvScalar(130,256,256), imgThresh3);
cvOr(imgThresh, imgThresh3, imgThresh);
return imgThresh;
}

int main(){
CvCapture* capture =0;

capture = cvCaptureFromCAM(0);
if(!capture){
printf("Capture failure\n");
return -1;
}

IplImage * frame = 0;

cvNamedWindow("Video");
cvNamedWindow("Ball");


//iterate through each frames of the video
while(true){

frame = cvQueryFrame(capture);
if(!frame) break;

frame=cvCloneImage(frame);
cvSmooth(frame, frame, CV_GAUSSIAN,3,3); //smooth the original image using Gaussian kernel

IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
cvCvtColor(frame, imgHSV, CV_BGR2HSV); //Change the color format from BGR to HSV

IplImage* imgThresh = GetThresholdedImage(imgHSV);

cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN,3,3); //smooth the binary image using Gaussian kernel

cvShowImage("Ball", imgThresh);
cvShowImage("Video", frame);
int sum = 0;
for (int i = 0; i < imgThresh->width; i++) {
for (int j = 0; j < imgThresh->height; j++) {
// WHAT DO I NEED HERE TO CALCULATE CERTAIN COLOR
}
}
if (sum > 1) { cout >> "Detected"; }
else { cout >> "Not Detected"; }

//Clean up used images
cvReleaseImage(&imgHSV);
cvReleaseImage(&imgThresh);
cvReleaseImage(&frame);

//Wait 50mS
int c = cvWaitKey(10);
//If 'ESC' is pressed, break the loop
if((char)c==27 ) break;
}

cvDestroyAllWindows() ;
cvReleaseCapture(&capture);

return 0;
}

最佳答案

图像处理不是一门精确的科学,解决方案取决于输入数据...

  • 如果您使用数字创建的图像,您可以在过滤后的图像上使用 cvCountNonZero 计算正像素
  • 如果您的图像是真实世界的捕捉,那么任何给定图像都有可能至少有一些像素与您的滤镜颜色相同。在局部滑动窗口中计算像素可能会更好,但这肯定不是唯一的方法。例如,抓取坐标 (0,0) 到 (100,100) 之间的区域,并计算非零的数量。如果超过一定数量,假设你有一个积极的。否则,继续重叠窗口 (0,50) 到 (100, 150)...

关于c++ - 使用 OpenCV 检测视频中的特定(定性)颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529184/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com