2014-02-06 4 views
0

이진 이미지가 있습니다. 및 그 일부 섹션을 완전히 검정색으로 채우고 나머지는 흰색으로 채 웁니다. 내가 원하는 것은 여기서 가장 잘 설명 할 수 있습니다. http://www.roborealm.com/tutorial/Obstacle_Avoidance/slide020.php 설명 - 오른쪽 아래부터 시작하여 왼쪽 상단에 도달합니다. 검은 색이 아닌 픽셀을 찾으면 Y 좌표가 더 작고 X 좌표가 같은 모든 픽셀이 검정색이됩니다. 이미지의 맨 아래에서 시작하여 픽셀이 비어있을 때까지 각 빈 검은 픽셀을 채우는 픽셀 단위로 진행하면됩니다 검은 색 픽셀이 보인다. 채우기는 수직 열을 멈추고 다음 열로 진행합니다.opencv에서 이진 이미지의 측면을 채우는 방법은 무엇입니까?

opencv에 코드를 작성했습니다. 해당 섹션에 대해서만 언급하고 있습니다.

for (int j =dst.cols; j>=0; j--) { 
    for (int i =dst.rows; i>=0; i--) { 
     if (dst.at<char>(i,j) == 0){ 
      dst.at<char>(i,j)=255; 
     } 
     if (dst.at<char>(i,j)>0){ 
      for (int k =i; k>=0; k--) { 
       dst.at<char>(k,j)=0; 
      } 
     } 
    } 
} 

그러나 작동하지 않습니다. 그러나 세그먼트 오류 (코어 덤프)가있었습니다.

답변

1

노력이 (테스트하지) : (different test 사용 unsigned char 대신 char

for (int j =dst.cols-1; j>=0; j--) 
{ 
    bool white = true; 
    for (int i =dst.rows-1; i>=0; i--) 
    { 
     if (dst.at<unsigned char>(i,j) > 0) 
     { 
      white = false; 
     } 
     if(white) 
      dst.at<unsigned char>(i,j)=255; 
     else 
      dst.at<unsigned char>(i,j)=0; 

    } 
} 

편집 :이진 조건이 성립하는지 확인하려면 == 255 대신을 입력하십시오.

+0

고맙습니다. 내가 틀린 곳을 알 수 있습니까? 고맙습니다. – Shubham

+0

그것은 효과가 있었다. 고맙습니다. – Shubham

+0

두 가지 가능한 문제점이 있습니다 : 1.'unsigned char' 대신'char'에 대해 테스트하면'255' 값을 찾지 못할 것입니다 2. 당신이' > 0' 값을 반환합니다. 그렇지 않으면 내부 'for' 루프가 결과를 다시 덮어 씁니다. – Micka

2

은 다음과 같아야합니다

for (int j =dst.cols-1; j>=0; j--) { 
for (int i =dst.rows-1; i>=0; i--) { 

UPD :이 빠른해야한다고 생각 :

#pragma once 
#include <string> 
#include <iostream> 
#include <vector> 
#include "opencv2/opencv.hpp" 
using namespace std; 
using namespace cv; 
//---------------------------------------------------------- 
// MAIN 
//---------------------------------------------------------- 
int main(int argc, char* argv[]) 
{ 
    // src image 
    Mat src; 
    // dst image 
    Mat dst; 
    // Image loading 
    namedWindow("result"); 
    namedWindow("src"); 
    src=imread("d:\\ImagesForTest\\obstacle_scene_1_edge.jpg",0); 
    dst=Mat::zeros(src.size(),CV_8UC1); 
    for (int i=0;i<src.cols;++i) 
    { 
     int j=src.rows-1; 
     for (j=src.rows-1;j>0;--j) 
     { 
      if(src.at<uchar>(j,i)>0) 
      {   
       break; 
      } 
     } 
     dst(Range(j,dst.rows-1),Range(i,i+1))=255; 
    } 
    imshow("src",src); 
    imshow("result",dst); 
    //---------------------------------------------------------- 
    // Wait key press 
    //---------------------------------------------------------- 
    waitKey(0); 
    destroyAllWindows(); 
    return 0; 
} 
+0

날 해보자 행과 열을 선언 내 코드를 참조의 오류입니다. – Shubham

+0

다시 완전히 흰색 이미지가 표시됩니다. – Shubham

+0

잠깐 기다려 코드를 확인해 보겠습니다. –

0

동일한 종이/웹 사이트를 언급하고 있습니다. 하지만 MATLAB을 사용하고 있습니다.

% 아래에서 위로 이미지를 채우는 루프 기능 [행, 열] = 크기 (이진 이미지);

(j = 1 : 150); i = 1 : 100에 대한 열의 % % ; 행 % 수

퍼센트 흰색 픽셀 (lastRow, firstColumns)

Find_white_pixel = 찾기 (바이너리 이미지 == 0, 1, '첫 번째')하는 경우부터 찾기; new_pixel = imfill (바이너리 이미지, i, j) == 0; 비 부족의 픽셀이

else 
     [rows, columns-1]=0; 
      new_pixel=imfill (Binary Image,i++,j)==1; 

끝 끝 끝을 볼 때까지 %의 픽셀을 채우는

하지만 덕분에,

+0

새로운 질문이있는 경우 [질문하기] (http://stackoverflow.com/questions/ask) 버튼을 클릭하여 질문하십시오. 컨텍스트에 대한 링크를 포함 할 수 있습니다.또는 새로운 질문에 대한 답변을 받으려면이 질문에 별표를 표시하십시오. 충분한 평판을 얻은 후에는 [upvote] (http://stackoverflow.com/privileges/vote-up) 또는 [현상금 추가] (http://stackoverflow.com/privileges/set-bounties) 더 많은 관심을 끌기 위해 –

관련 문제