2012-09-25 8 views
6

मुझे आश्चर्य है कि ओपनसीवी में IplImage को फसल करने का सबसे प्रभावी तरीका क्या है। मैं वर्तमान में निम्नलिखित करता हूं, लेकिन यह बहुत जटिल लगता है और मुझे यकीन है कि चीजों को करने का एक बेहतर तरीका है।क्रॉपिंग IplImage सबसे प्रभावी ढंग से

// set ROI on original image, create 'tmp' image and copy data over. 
    cvSetImageROI(orig_image, cvRect(55, 170, 530, 230)); 

    IplImage *tmp = cvCreateImage(cvGetSize(orig_image), 
           orig_image->depth, 
           orig_image->nChannels); 

    cvCopy(m_depth_run_avg, tmp, NULL); 
    cvResetImageROI(orig_image); 

    // copy temporary image back to original image. 
    IplImage *orig_image= cvCreateImage(cvGetSize(tmp), 
          tmp->depth, 
          tmp->nChannels); 
    cvCopy(tmp, orig_image, NULL); 

क्या छवि को फसल करने का एक बेहतर तरीका है?

उत्तर

5

हाँ, वहां है। आप अंत में मूल छवि को पुन: प्रयास कर रहे हैं। के रूप में निम्नलिखित कोड को दर्शाता है कि आवश्यक नहीं है,:

IplImage* orig = cvLoadImage("test.jpg"); 
if (!orig) 
{ 
    return -1; 
} 
printf("Orig dimensions: %dx%d\n", orig->width, orig->height); 

cvSetImageROI(orig, cvRect(0, 250, 350, 350)); 

IplImage *tmp = cvCreateImage(cvGetSize(orig), 
           orig->depth, 
           orig->nChannels); 

cvCopy(orig, tmp, NULL); 
cvResetImageROI(orig); 

orig = cvCloneImage(tmp); 
printf("Orig dimensions after crop: %dx%d\n", orig->width, orig->height); 

cvNamedWindow("result", CV_WINDOW_AUTOSIZE); 
cvShowImage("result", orig); 
cvWaitKey(0); 
cvDestroyWindow("result"); 

दुर्भाग्य से, यह जरूरी है कि आप cvCopy() का परिणाम स्टोर करने के लिए एक अस्थायी छवि बनाने।

+1

सुनिश्चित करें कि 'cvLoadImage() 'ने एक छवि को सफलतापूर्वक लोड किया है। मैंने उस फ़ाइल को कड़ी मेहनत की जिसे मुझे एप्लिकेशन में लोड करने की आवश्यकता थी। आपके पास निश्चित रूप से ** test.jpg ** एप्लिकेशन की निर्देशिका में बिछा नहीं है। मैं गारंटी देता हूं कि यह कोड काम करता है। यदि यह आपकी मशीन पर दुर्घटनाग्रस्त हो रहा है, तो आपको वास्तव में, वास्तव में, वास्तव में ध्यान देना होगा कि आप अलग-अलग क्या कर रहे हैं (या नहीं कर रहे हैं)। – karlphillip

+0

जब मैं वीडियो फ्रेम फसल करने के लिए इसका उपयोग कर रहा हूं तो उस कोड के साथ मेरे पास कुछ प्रकार की मेमोरी रिसाव समस्या है। – Kamil

+0

[शायद यह 'cvCloneImage() 'या' cvLoadImage() '] (http://www.cprogramdevelop.com/4885055/) के कारण है। क्या आप 'cvReleaseImage()' भूल गए थे? – karlphillip

0

आप आसानी से सी ++ का उपयोग करके छवि को फसल कर सकते हैं। सुनिश्चित करें कि यह कोड सफलतापूर्वक है। इसे

     IplImage *source_image = cvLoadImage("paper.jpg", 1); 


        cout << "Width:" << source_image->width << " pixels" << endl; 
        cout << "Height:" << source_image->height << " pixels" << endl; 
        int width = source_image->width; 
        int lenght = source_image->height; 

        cv::Rect roi; 
        roi.x = 1200; //1200  // 950 
        roi.y = 355; //350  //150 
        roi.width = 2340; //2360   //2750 
        roi.height = 1425; //1235 /2500   //2810 //2465 fully braille sheet 


        IplImage *cropped_Image1 = cvCreateImage(cvSize(roi.width, roi.height), source_image->depth, source_image->nChannels); 
        cvSetImageROI(source_image, roi); 
        cvCopy(source_image, cropped_Image1); 
        cvResetImageROI(source_image); 
        cvShowImage("Cropped Image", cropped_Image1); 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^