6
votes

Comment noir de sortir tout en dehors d'un cercle dans OpenCV

J'essaie actuellement de tout noir dehors en dehors d'un cercle. Je dessine le cercle en utilisant les lignes de code suivantes: XXX

Quelle est la meilleure approche de la peinture de tout le noir circuit, si j'ai un rayon et le centre de mon cercle? Est-ce que OPENCV fournit un mécanisme facile de le faire ou devrais-je itération à travers tous les pixels de mon image et en fonction de la position les couleur noire ou non?


1 commentaires

Créez une image de masque (tracez simplement le cercle en couleur blanche sur une image noire avec la taille identique à celle de votre image d'origine), puis utilisez Bitwise_and () avec votre image et votre masque ..


4 Réponses :


3
votes

Vous pouvez faire l'arrière-plan la couleur que vous souhaitez xxx

puis dessinez vos cercles


0 commentaires

7
votes

Merci à Abid pour l'indice, j'ai fini par cette approche. Tout fonctionne bien: xxx


0 commentaires

0
votes

Je viens d'essayer votre code de code et ça marche. De plus, si vous souhaitez modifier la couleur d'arrière-plan au lieu de noir, selon OpenCV Docs ici , avant copyto code> Le tapis de destination sera initialisé si nécessaire, il suffit donc d'ajouter du code ci-dessous:

cv::Mat maskedImage(srcImageForDimensions.size(), srcImageForDimensions.type()); // stores masked Image 
maskedImage.setTo(cv::Scalar(0,0,255)); // set background color to red


0 commentaires

1
votes

Je pense que ce commentaire juste sous votre question est la meilleure solution. J'ai fait une version modifiée de votre code pour une image 5M de la caméra Fisheye. Cette image doit également faire de noir tous les points à l'extérieur du cercle.

#include <Windows.h>
#include <Vfw.h>
#include <string>
#include <iostream>    
#include "opencv2\core\core.hpp"
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\imgcodecs\imgcodecs.hpp"
#include "opencv2\highgui\highgui.hpp"    
using namespace std;
using namespace cv;    
int _tmain(int argc, _TCHAR* argv[])
{
    cv::Mat im_source_non_square = cv::imread("D:/FishLib/sample_02.bmp", CV_LOAD_IMAGE_COLOR);
    cv::namedWindow("Image",CV_WINDOW_FREERATIO);
    cv::imshow("Image", im_source_non_square);
    Mat im_source_square;
    int m_nCenterX=1280;
    int m_nCenterY=960;
    int m_nRadius=916;
    Mat im_mask=im_source_non_square.clone();
    im_mask.setTo(cv::Scalar(0,0,0));
    circle( im_mask, cv::Point(m_nCenterX,m_nCenterY), m_nRadius, cv::Scalar(255,255,255), -3, 8, 0 );
    cv::namedWindow("Mask image",CV_WINDOW_FREERATIO);
    cv::imshow("Mask image", im_mask);
    Mat im_source_circle;
    cv::bitwise_and(im_source_non_square,im_mask,im_source_circle);
    cv::namedWindow("Combined image",CV_WINDOW_FREERATIO);
    cv::imshow("Combined image", im_source_circle);
    cv::waitKey(0);
    return 0;
}


0 commentaires