Определить сопротивления в C++ и opencvC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Определить сопротивления в C++ и opencv

Сообщение Anonymous »

Напишите максимально совершенный код для разработки приложения, которое с помощью набора алгоритмов позволяет подсчитывать и идентифицировать электрические сопротивления, присутствующие в видео. Это приложение должно иметь возможность сегментировать различные сопротивления (и только сопротивления), определяя их значение (выраженное в омах) и относительное расположение (какую область изображения занимает каждое сопротивление) в каждом кадре видео.
На C++ и с использованием openCV
Может ли кто-нибудь здесь помочь? Я не знаю, что делаю не так

Код: Выделить всё

#include 
#include 

using namespace cv;
using namespace std;

// Função para identificar as bandas de cores em um resistor
vector identifyColorBands(const Mat& roi) {
vector bands;
Mat hsv, mask;
cvtColor(roi, hsv, COLOR_BGR2HSV);

// Definir faixas de cores para bandas de resistores
vector lower_bounds = {
Scalar(0, 70, 50), Scalar(10, 100, 100), Scalar(20, 100, 100), Scalar(30, 100, 100),
Scalar(50, 100, 100), Scalar(70, 100, 100), Scalar(90, 100, 100), Scalar(0, 0, 50)
};
vector upper_bounds = {
Scalar(10, 255, 255), Scalar(20, 255, 255), Scalar(30, 255, 255), Scalar(40, 255, 255),
Scalar(70, 255, 255), Scalar(90, 255, 255), Scalar(110, 255, 255), Scalar(180, 50, 200)
};

for (size_t i = 0; i < lower_bounds.size(); i++) {
inRange(hsv, lower_bounds[i], upper_bounds[i], mask);
vector contours;
findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

for (const auto& contour : contours) {
Rect boundingBox = boundingRect(contour);
if (boundingBox.height > roi.rows / 3 && boundingBox.width < roi.cols / 3) {
bands.push_back(boundingBox);
}
}
}

// Ordenar as bandas de cores de acordo com a posição no eixo x
sort(bands.begin(), bands.end(), [](const Rect& a, const Rect& b) {
return a.x < b.x;
});

return bands;
}

// Função para detectar e rotular resistências
void detectAndLabelResistors(Mat& frame) {
Mat gray, blurred, binary, dilated;

// Converter para escala de cinza
cvtColor(frame, gray, COLOR_BGR2GRAY);

// Aplicar filtro gaussiano para suavizar a imagem
GaussianBlur(gray, blurred, Size(5, 5), 1.5);

// Binarizar a imagem usando limiarização global com Otsu
threshold(blurred, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);

// Dilatar a imagem para conectar componentes
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
dilate(binary, dilated, kernel);

// Encontrar contornos dos blobs
vector contours;
vector hierarchy;
findContours(dilated, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

// Desenhar contornos e rótulos nos blobs
for (size_t i = 0; i < contours.size(); i++) {
Rect boundingBox = boundingRect(contours[i]);

// Calcular a razão de aspecto do bounding box
float aspectRatio = (float)boundingBox.width / (float)boundingBox.height;

// Definir critérios para detectar um resistor
bool isResistor = (aspectRatio > 2.0) && (boundingBox.width > 30) && (boundingBox.height > 10) && (boundingBox.width < 300) && (boundingBox.height < 100);

if (isResistor) {
rectangle(frame, boundingBox, Scalar(0, 255, 0), 2);
Point labelPosition(boundingBox.x, boundingBox.y - 10);
putText(frame, "Resistor", labelPosition, FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2);

// Identificar e rotular as bandas de cores
Mat roi = frame(boundingBox);
vector colorBands = identifyColorBands(roi);
for (size_t j = 0; j < colorBands.size() && j < 3; j++) {
rectangle(roi, colorBands[j], Scalar(255, 0, 0), 2);
putText(roi, "Banda " + to_string(j + 1), colorBands[j].tl(), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 0, 0), 1);
}
}
}
}

int main() {
// Abrir o vídeo
VideoCapture cap("video_resistors.mp4");
if (!cap.isOpened()) {
cerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/78497888/identificar-resistencias-em-c-e-opencv[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»