Quantcast
Channel: OpenCV Q&A Forum - RSS feed
Viewing all articles
Browse latest Browse all 41027

Why is pointPolygonTest() method of OpenCV4Android returning -1 for every pixel?

$
0
0
In the following code, I have carried out the following steps: 1. Loaded an image from sdcard. [![enter image description here][1]][1] 2. Converted it to HSV format. 3. Used `inRange` function to mask out the red color. [![enter image description here][2]][2] 4. Used `findContours` to find the contours. 5. Find the largest contour from those contours. 6. Created an ROI around the largest contour using `boundingRect` and `submat` functions. [![enter image description here][3]][3] 7. Converted this ROI Mat to HSV format. [![enter image description here][4]][4] 8. Iterated through the ROI Mat, and check for each pixel if it lies within the largest contour. **I used the method `pointPolygonTest` to find this out, but it returns `-1` for every pixel, as can be seen from the `Log.i` output [I have pasted here](http://pastebin.com/w3sCCxa9). The question is why? How can I correct this.** private Scalar detectColoredBlob() { rgbaFrame = Highgui.imread("/mnt/sdcard/DCIM/rgbaMat4Mask.bmp"); Mat hsvImage = new Mat(); Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_BGR2HSV); Highgui.imwrite("/mnt/sdcard/DCIM/hsvImage.bmp", hsvImage);// check Mat maskedImage = new Mat(); Core.inRange(hsvImage, new Scalar(0, 100, 100), new Scalar(10, 255, 255), maskedImage); Highgui.imwrite("/mnt/sdcard/DCIM/maskedImage.bmp", maskedImage);// check List contours = new ArrayList(); Imgproc.findContours(maskedImage, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); // \/ We will use only the largest contour. Other contours (any other possible blobs of this color range) will be ignored. MatOfPoint largestContour = contours.get(0); double largestContourArea = Imgproc.contourArea(largestContour); for (int i = 1; i < contours.size(); ++i) {// NB Notice the prefix increment. MatOfPoint currentContour = contours.get(i); double currentContourArea = Imgproc.contourArea(currentContour); if (currentContourArea > largestContourArea) { largestContourArea = currentContourArea; largestContour = currentContour; } } MatOfPoint2f largestContour2f = new MatOfPoint2f(largestContour.toArray());// Required on Line 289. See http://stackoverflow.com/questions/11273588/how-to-convert-matofpoint-to-matofpoint2f-in-opencv-java-api Rect detectedBlobRoi = Imgproc.boundingRect(largestContour); Mat detectedBlobRgba = rgbaFrame.submat(detectedBlobRoi); Highgui.imwrite("/mnt/sdcard/DCIM/detectedBlobRgba.bmp", detectedBlobRgba);// check Mat detectedBlobHsv = new Mat(); Imgproc.cvtColor(detectedBlobRgba, detectedBlobHsv, Imgproc.COLOR_BGR2HSV); Highgui.imwrite("/mnt/sdcard/DCIM/roiHsv.bmp", detectedBlobHsv);// check for (int firstCoordinate = 0; firstCoordinate < detectedBlobHsv.rows(); firstCoordinate++) { for (int secondCoordinate = 0; secondCoordinate < detectedBlobHsv.cols(); secondCoordinate++) { Log.i(TAG, "HAPPY " + Arrays.toString(detectedBlobHsv.get(firstCoordinate, secondCoordinate))); if (Imgproc.pointPolygonTest(largestContour2f, new Point(firstCoordinate, secondCoordinate), false) == -1) { Log.i(TAG, "HAPPY ....................... OUTSIDE"); } } } Highgui.imwrite("/mnt/sdcard/DCIM/processedcontoured.bmp", detectedBlobHsv);// check [1]: http://i.stack.imgur.com/Kknp5.png [2]: http://i.stack.imgur.com/Fl2Zg.png [3]: http://i.stack.imgur.com/YJVSf.png [4]: http://i.stack.imgur.com/sIexK.png

Viewing all articles
Browse latest Browse all 41027

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>