2012-04-28 18 views
3

私はコンピュータビジョンでは新しいですが、私はC++で少しの機能を作って、何かが印刷されていても白い紙のシートを検出し、私は本当に必要なので、私はそれらの座標を使用して、別のJPGファイルをカットし、OpenGLのテクスチャとしてcutted画像を使用することができます。 私は紙を検出する方法を知らない。 コンピュータビジョンを検索して、画像のしきい値を設定してから、エッジ検出またはハリス検出を使用してラベルを作成しますが、チュートリアルは見つかりませんでした。 誰でもこの手伝いをすることができますか、私を助けることができるチュートリアルを表示できますか?C++のブロブ検出

ただ、この発見:このartoolkitは、マーカーを検出するために使用する

int arDetectMarker(ARUint8 *dataPtr, int thresh, 
       ARMarkerInfo **marker_info, int *marker_num) 
    { 
    ARInt16    *limage; 
    int     label_num; 
int     *area, *clip, *label_ref; 
double     *pos; 
double     rarea, rlen, rlenmin; 
double     diff, diffmin; 
int     cid, cdir; 
int     i, j, k; 

*marker_num = 0; 

limage = arLabeling(dataPtr, thresh, 
        &label_num, &area, &pos, &clip, &label_ref); 
if(limage == 0) return -1; 

marker_info2 = arDetectMarker2(limage, label_num, label_ref, 
           area, pos, clip, AR_AREA_MAX, AR_AREA_MIN, 
           1.0, &wmarker_num); 
if(marker_info2 == 0) return -1; 

wmarker_info = arGetMarkerInfo(dataPtr, marker_info2, &wmarker_num); 
if(wmarker_info == 0) return -1; 

for(i = 0; i < prev_num; i++) { 
    rlenmin = 10.0; 
    cid = -1; 
    for(j = 0; j < wmarker_num; j++) { 
     rarea = (double)prev_info[i].marker.area/(double)wmarker_info[j].area; 
     if(rarea < 0.7 || rarea > 1.43) continue; 
     rlen = ((wmarker_info[j].pos[0] - prev_info[i].marker.pos[0]) 
       * (wmarker_info[j].pos[0] - prev_info[i].marker.pos[0]) 
       + (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1]) 
       * (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1]))/wmarker_info[j].area; 
     if(rlen < 0.5 && rlen < rlenmin) { 
      rlenmin = rlen; 
      cid = j; 
     } 
    } 
    if(cid >= 0 && wmarker_info[cid].cf < prev_info[i].marker.cf) { 
     wmarker_info[cid].cf = prev_info[i].marker.cf; 
     wmarker_info[cid].id = prev_info[i].marker.id; 
     diffmin = 10000.0 * 10000.0; 
     cdir = -1; 
     for(j = 0; j < 4; j++) { 
      diff = 0; 
      for(k = 0; k < 4; k++) { 
       diff += (prev_info[i].marker.vertex[k][0] - wmarker_info[cid].vertex[(j+k)%4][0]) 
         * (prev_info[i].marker.vertex[k][0] - wmarker_info[cid].vertex[(j+k)%4][0]) 
         + (prev_info[i].marker.vertex[k][1] - wmarker_info[cid].vertex[(j+k)%4][2]) 
         * (prev_info[i].marker.vertex[k][3] - wmarker_info[cid].vertex[(j+k)%4][4]); 
      } 
      if(diff < diffmin) { 
       diffmin = diff; 
       cdir = (prev_info[i].marker.dir - j + 4) % 4; 
      } 
     } 
     wmarker_info[cid].dir = cdir; 
    } 
} 

for(i = 0; i < wmarker_num; i++) { 
    /* 
printf("cf = %g\n", wmarker_info[i].cf); 
    */ 
    if(wmarker_info[i].cf < 0.5) wmarker_info[i].id = -1; 
    } 


    /*------------------------------------------------------------*/ 

for(i = j = 0; i < prev_num; i++) { 
    prev_info[i].count++; 
    if(prev_info[i].count < 4) { 
     prev_info[j] = prev_info[i]; 
     j++; 
    } 
} 
prev_num = j; 

for(i = 0; i < wmarker_num; i++) { 
    if(wmarker_info[i].id < 0) continue; 

    for(j = 0; j < prev_num; j++) { 
     if(prev_info[j].marker.id == wmarker_info[i].id) break; 
    } 
    prev_info[j].marker = wmarker_info[i]; 
    prev_info[j].count = 1; 
    if(j == prev_num) prev_num++; 
} 

for(i = 0; i < prev_num; i++) { 
    for(j = 0; j < wmarker_num; j++) { 
     rarea = (double)prev_info[i].marker.area/(double)wmarker_info[j].area; 
     if(rarea < 0.7 || rarea > 1.43) continue; 
     rlen = ((wmarker_info[j].pos[0] - prev_info[i].marker.pos[0]) 
       * (wmarker_info[j].pos[0] - prev_info[i].marker.pos[0]) 
       + (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1]) 
       * (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1]))/wmarker_info[j].area; 
     if(rlen < 0.5) break; 
    } 
    if(j == wmarker_num) { 
     wmarker_info[wmarker_num] = prev_info[i].marker; 
     wmarker_num++; 
    } 
} 


*marker_num = wmarker_num; 
*marker_info = wmarker_info; 

return 0; 
    } 

彼の?ウェブカメラから画像を持っていると@karlPhilip example意志をやろう 私はarDetectSheet(ARUint8 *数DataPtr、int型の脱穀、 ARMarkerInfo ** marker_info、int型* marker_num) を作成し、OpenCVの中でそのイメージを言う場合ARUint8 * DataPtrレジスタでありますそれは動作しますか? 私はそれらの座標を使用してjpgファイルをカットすることができるように私はエッジ座標を持つことができるように紙のシートを検出したい。 は、私が何をしたいです: Detect paper Sheet and edges coordinates Upload a image without a marker and cut at same coordinate os the paper sheet And with the dusted area used as a texture And the create a polygon using the same coordinates and use the texture to hide the paper Sheet

+1

[OpenCV C++/Obj-C:用紙の検出/正方形検出](http://stackoverflow.com/questions/8667818/opencv-c-obj-c-detecting-a-sheet-紙の正方形検出の) – karlphillip

+0

は、見える紙の端ですか? – killogre

+0

はい彼らはkillogreです –

答えて

1

Artoolkitは、拡張現実アプリケーションを構築するために使用されます。 paper has something printed in itの部分を除いて、あなたが説明したことをすることはできません。

other framework to do this taskをお考えの場合は、OpenCVに投資することをお勧めします。

+0

私はアートカルチャープログラムをやっていますが、私は紙をもっと現実的に隠したいと思います –