2011-10-30 82 views
7

ROI chỉ có thể được triển khai bằng hình chữ nhật. Tuy nhiên tôi có một đường bao mà tôi muốn đặt làm ROI. Có ai có một ý tưởng về cách tôi sẽ đi về bằng cách sử dụng một đường viền như là một ROI hơn là một hình chữ nhật?Sử dụng ROI trong OpenCV?

Nếu không, làm cách nào tôi có thể tập trung hành động của mình chỉ bằng pixel trong một đường bao cụ thể?

Cảm ơn

PS: Xin lỗi vì tất cả các câu hỏi OpenCV này. Chỉ thực sự bối rối: $

+0

Bạn có lỗi đánh máy trong tiêu đề. Ngoài ra, hầu hết các hàm OpenCV đều có tham số mặt nạ và chỉ hoạt động trên vùng đầu vào của chúng, trong đó mặt nạ có giá trị đặc biệt. Bạn thực sự muốn làm gì? –

+1

Tôi muốn sử dụng phép chiếu ngược biểu đồ trên các pixel trong đường bao được xác định trước. Vì vậy, về cơ bản tôi sẽ chỉ tạo ra một mặt nạ màu đen và trắng của đường viền đầy đó và sau đó sử dụng nó như một mặt nạ cho hình ảnh tôi muốn sử dụng backprojection histogram trên? – user1017485

+0

nếu bạn không muốn nhận điểm ảnh trong đường bao, như được đề xuất trước khi che đường viền (vẽ đường viền - màu trắng trên nền đen rồi sử dụng nó làm mặt nạ trên hình ảnh gốc) là cách hiển nhiên. – AruniRC

Trả lời

7

OpenCV chỉ hỗ trợ ROI hình chữ nhật.

Tuy nhiên, để thực hiện một số xử lý cho các pixel cụ thể, bạn có thể sử dụng một số chức năng trợ giúp.

Một trong số đó là pointPolygonTest(), cho bạn biết một pixel nhất định không thuộc về đa giác.

Vì vậy, bạn có thể viết một cái gì đó giống như

for(i=0;i<height;i++) 
{ 
     for(j=0;j<width;j++) 
     { 
      if(pointPolygonTest(Point(i,j),myPolygon)) 
      { 
       // do some processing 
      } 
     } 
} 

Ngoài ra kiểm tra mẫu này http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.html#point-polygon-test

khác (nhanh hơn) lựa chọn là một trong những sugested bởi @ andeas-haferburg. Tạo một mặt nạ bằng cách vẽ đa giác của bạn trong một hình ảnh màu xám mới:

drawPoly() 

(Vì vậy, nền đó là 0, và đa giác là 255), Sau đó, bạn có thể vượt qua đối với một số chức năng khác, hoặc sử dụng nó bằng cách tự hỏi:

for(i=0;i<height;i++) 
{ 
     for(j=0;j<width;j++) 
     { 
      if(mask[j+w*i])) 
      { 
       // do some processing 
      } 
     } 
} 

Ví dụ trên chỉ là mã giả, bạn phải làm cho nó hoạt động.

+0

Cảm ơn bạn đã giúp đỡ rất nhiều – user1017485

+0

@ user1017485 bạn có tìm ra cách để làm điều đó không? Tôi gặp vấn đề tương tự. – Mzk

+0

@ user1017485 bạn đã tìm ra điều này chưa? Tôi cũng muốn biết làm thế nào để làm điều này. – bearzk

Các vấn đề liên quan