मैं विजुअल स्टूडियो पर सी ++ और ओपनसीवी के साथ काम कर रहा हूं; मेरे आवेदन के लिए, मेरे पास छवियों का एक सेट और एक .mask है जो उनमें से प्रत्येक में आरओआई का चयन करने की अनुमति देता है (यह हर जगह 0 है लेकिन आरओआई में)।

मैं छवियों (duck1.jpg, duck2.jpg, आदि) के साथ लोड करता हूं:

std::array<cv::Mat, n_imgs> img;
std::string folder = "C:/Users/imgs/";
std::string fname = "duck";
std::string format = ".jpg";

for (int i = 0; i < n_imgs; i++)
    img[i] = cv::imread(folder + fname + std::to_string(i + 1) + format, 0);

फिर, मैं एक मुखौटा लागू करता हूं:

cv::Mat mask = cv::imread(folder + fname + ".mask" + format, 0);

for (int i = 0; i < img[0].rows; i++)
    for (int j = 0; j < img[0].cols; j++)
        for (int k = 0; k < n_imgs; k++)
            if (mask.at<float>(i, j) == 0)
                img[k].at<float>(i, j) = 0.f;

मैं प्राप्त करता रहता हूं 'Project.exe ने ब्रेकपॉइंट ट्रिगर किया है।' मेरे लगातार कोड के कुछ आवर्ती बिंदुओं में काफी यादृच्छिक रूप से (जो मैं यहां पोस्ट नहीं करूंगा क्योंकि काफी लंबा है); हालांकि, जब मैं मास्किंग लाइन पर टिप्पणी करता हूं तो ये समस्याएं गायब हो जाती हैं।

लक्षणों को देखते हुए, मुझे लगा कि यह आवंटन की समस्या है, क्या मैं सही हूँ? मेरे द्वारा यह कैसे किया जा सकता है?

0
Eggman 26 जुलाई 2018, 09:51
1
क्या आप सुनिश्चित हैं कि आपका मुखौटा आपकी पहली छवि के समान आकार का है? क्या आप सुनिश्चित हैं कि आपकी सभी छवियां समान आकार की हैं? आपका कोड यही मान रहा है।
 – 
john
26 जुलाई 2018, 09:54
रुकने का कारण क्या है?
 – 
user7860670
26 जुलाई 2018, 10:00
हां, मैंने सत्यापित किया है कि दोनों सीधे फाइलों की जांच कर रहे हैं और डिबगिंग कर रहे हैं; साथ ही, मैं cv::Mats के साथ क्या होता है, इस पर नज़र रखने के लिए इमेज वॉच का उपयोग करता हूं, और यह कोई समस्या नहीं होनी चाहिए। यह सच है कि मुझे शायद कुछ त्रुटि प्रबंधन जोड़ना चाहिए, अभी के लिए मैं इसे अनदेखा कर रहा हूं।
 – 
Eggman
26 जुलाई 2018, 10:09

2 जवाब

सबसे बढ़िया उत्तर

यह अनुमान से अधिक होगा कि क्या गलत है लेकिन मैं आपको एक संकेत दूंगा।

क्या आप सुनिश्चित हैं कि img अंतर्निहित प्रकार के रूप में तैर रहे हैं? क्योंकि जब आप cv::imread(file, IMREAD_GRAYSCALE ) करते हैं तो यह 0 ग्रे स्केल इमेज के लिए खड़ा होता है जो आमतौर पर CV_8UC1 (8 बिट का अहस्ताक्षरित चार) होता है जब आप इसे फ्लोट (जिसका आकार 32 बिट का होता है) से संबोधित करते हैं तो आप अंत के बाद मेमोरी लिखना समाप्त कर सकते हैं छवि का (छवि में अंतिम पिक्सेल के 24 बिट बाद लिखा जाता है)। यह कभी-कभी त्रुटि को ट्रिगर कर सकता है और कभी-कभी नहीं, यह इस बात पर निर्भर करता है कि आपकी छवि के बाद स्मृति में क्या है (क्या यह आवंटित है या नहीं)। मुझे लगता है कि यदि आप अपना प्रोग्राम डीबग मोड में चलाते हैं तो यह हमेशा असफल रहेगा।

तो बदलें:

for (int i = 0; i < img[0].rows; i++)
    for (int j = 0; j < img[0].cols; j++)
        for (int k = 0; k < n_imgs; k++)
            if (mask.at<float>(i, j) == 0)
                img[k].at<float>(i, j) = 0.f;

प्रति:

for (int i = 0; i < img[0].rows; i++)
    for (int j = 0; j < img[0].cols; j++)
        for (int k = 0; k < n_imgs; k++)
            if (mask.at<unsigned char>(i, j) == 0)
                img[k].at<unsigned char>(i, j) = 0;

यदि आप चाहते हैं कि आपका कोड तेजी से चले और आपके पास बाइनरी मास्क है (0 और 1 के मान के साथ) तो आप इन तत्वों को इस तरह से गुणा कर सकते हैं (ध्यान दें कि यह केवल एक छवि के लिए है):

cv::Mat afterApplyMask = img.mul(mask);
1
wdudzik 26 जुलाई 2018, 10:08
यह सही है, धन्यवाद! मुझे पता है कि यह एक बेवकूफी है, लेकिन मैं पाइथन में ओपनसीवी के लिए काफी उपयोग कर रहा हूं, इसलिए इस तरह के विवरण हमेशा मुझे खराब कर देते हैं।
 – 
Eggman
26 जुलाई 2018, 10:52
खुशी है कि मैंने मदद की :)
 – 
wdudzik
26 जुलाई 2018, 10:56

जब मैं इस त्रुटि का सामना कर रहा था तो मैं विजुअल स्टूडियो में एक सी कोड लिख रहा था। स्रोत फ़ाइल में मेरे प्रोजेक्ट का नाम और समाधान का नाम वही था। एक बार जब मैंने उन्हें बदल दिया और डीबग किया, तो मैंने त्रुटि का सामना करना बंद कर दिया।

-1
SOHAM 8 अप्रैल 2020, 16:15