好的,這里是更新后的代碼,將所有 inRange
函數的第一個變量替換為 ZoomOutimage
:
// 綠色分岔路
if (divergerColor == "green" && nextColor == "null")
{cv::Mat frameGreen, frameRed;frame2.copyTo(frameGreen); // 復制原始圖像用于綠色二值化處理frame2.copyTo(frameRed); // 復制原始圖像用于紅色二值化處理// 二值化綠色inRange(ZoomOutimage, colorgroup.greenMin, colorgroup.greenMax, frameGreen); // 二值化綠色int numberGreen = 0;for (int i = 0; i < frameGreen.rows; i++){for (int j = 0; j < frameGreen.cols; j++){if (frameGreen.at<uchar>(i, j) == 255){numberGreen++;}}}// 二值化紅色inRange(ZoomOutimage, colorgroup.redMin, colorgroup.redMax, frameRed); // 二值化紅色int numberRed = 0;for (int i = 0; i < frameRed.rows; i++){for (int j = 0; j < frameRed.cols; j++){if (frameRed.at<uchar>(i, j) == 255){numberRed++;}}}// 出現綠色條帶if (numberGreen >= 500){mythread.mode = divergeleft;cout << "recognize green divergeleft" << endl;divergerColor = "null";frame2 = frameGreen;return;}// 出現紅色條帶else if (numberRed >= 500){mythread.mode = divergeleft;cout << "recognize red divergeleft" << endl;divergerColor = "null";frame2 = frameRed;return;}
}
// 紅色分岔路
else if (divergerColor == "red" && nextColor == "null")
{cv::Mat frameGreen, frameRed;frame2.copyTo(frameGreen); // 復制原始圖像用于綠色二值化處理frame2.copyTo(frameRed); // 復制原始圖像用于紅色二值化處理// 二值化綠色inRange(ZoomOutimage, colorgroup.greenMin, colorgroup.greenMax, frameGreen); // 二值化綠色int numberGreen = 0;for (int i = 0; i < frameGreen.rows; i++){for (int j = 0; j < frameGreen.cols; j++){if (frameGreen.at<uchar>(i, j) == 255){numberGreen++;}}}// 二值化紅色inRange(ZoomOutimage, colorgroup.redMin, colorgroup.redMax, frameRed); // 二值化紅色int numberRed = 0;for (int i = 0; i < frameRed.rows; i++){for (int j = 0; j < frameRed.cols; j++){if (frameRed.at<uchar>(i, j) == 255){numberRed++;}}}// 出現綠色條帶if (numberGreen >= 500){mythread.mode = divergeright;cout << "recognize green divergeright" << endl;divergerColor = "null";frame2 = frameGreen;return;}// 出現紅色條帶else if (numberRed >= 500){mythread.mode = divergeright;cout << "recognize red divergeright" << endl;divergerColor = "null";frame2 = frameRed;return;}
}// 棕色住戶識別
else if (residenceColor == "brown" && divergerColor == "null")
{// 復制原始圖像用于二值化處理cv::Mat frameBrown, frameViolet;frame2.copyTo(frameBrown);frame2.copyTo(frameViolet);inRange(ZoomOutimage, colorgroup.brownMin, colorgroup.brownMax, frameBrown); // 二值化棕色int numberBrown = 0;for (int i = 0; i < frameBrown.rows; i++){for (int j = 0; j < frameBrown.cols; j++){if (frameBrown.at<uchar>(i, j) == 255){numberBrown++;}}}inRange(ZoomOutimage, colorgroup.violetMin, colorgroup.violetMax, frameViolet); // 二值化紫色int numberViolet = 0;for (int i = 0; i < frameViolet.rows; i++){for (int j = 0; j < frameViolet.cols; j++){if (frameViolet.at<uchar>(i, j) == 255){numberViolet++;}}}// 出現紅色或棕色條帶if (numberBrown >= 500){mythread.mode = residenceright;cout << "recognize brown" << endl;residenceColor = "null";frame2 = frameBrown;return;}else if (numberViolet >= 500){mythread.mode = residenceright;cout << "recognize Violet" << endl;residenceColor = "null";frame2 = frameViolet;return;}
}
// 紫色住戶識別
else if (residenceColor == "violet" && divergerColor == "null")
{// 復制原始圖像用于二值化處理cv::Mat frameBrown, frameViolet;frame2.copyTo(frameBrown);frame2.copyTo(frameViolet);inRange(ZoomOutimage, colorgroup.brownMin, colorgroup.brownMax, frameBrown); // 二值化棕色int numberBrown = 0;for (int i = 0; i < frameBrown.rows; i++){for (int j = 0; j < frameBrown.cols; j++){if (frameBrown.at<uchar>(i, j) == 255){numberBrown++;}}}inRange(ZoomOutimage, colorgroup.violetMin, colorgroup.violetMax, frameViolet); // 二值化紫色int numberViolet = 0;for (int i = 0; i < frameViolet.rows; i++){for (int j = 0; j < frameViolet.cols; j++){if (frameViolet.at<uchar>(i, j) == 255){numberViolet++;}}}// 出現紅色或棕色條帶if (numberBrown >= 500){mythread.mode = residenceleft;cout << "recognize brown" << endl;residenceColor = "null";frame2 = frameBrown;return;}else if (numberViolet >= 500){mythread.mode = residenceleft;cout << "recognize Violet" << endl;residenceColor = "null";frame2 = frameViolet;return;}
}
在上述代碼中,所有 inRange
函數的第一個參數都已經替換為 ZoomOutimage
。這樣確保了所有二值化處理都是在 ZoomOutimage
上進行的。